|Think about Loose Coupling|
How is the utf-8 usually being corrupted?
A good question. It's a system that has it roots in Perl 4 and which consists of hundreds of pages (CGI scripts) that are being used by many different people 24x7. And which is currently being migrated to a more manageable situation, so there is little point in trying to find out which users are doing what on which page causing the problem.
What exactly are you doing (are you just removing illegal characters? what else)?
Indeed. They're mostly free text entries of different sources in various languages.
Rules (is it configurable, or will it be, how)?
The only configuration that I see, would be the ability to list the tables to correct (defaulting to all). And how fields fixed are reported (either STDERR or calling a subroutine).
...it sounds like a script to me
Well, it is is a script now. But I dislike scripts as such, because you are never flexible enough. I'd rather have a simple script that calls a module, than that people start copying a script and start adapting it to their needs.