I was in the same position. The created MySQL server was configured on latin1, the old data was latin1, the new data was utf8, but stored in latin1 columns, then utf8 columns were added ... Each row can contain any number of encodings.
The big problem is that there is no single solution that fixes everything, because many legacy encodings use the same bytes for different characters. This means that you have to resort to heuristics. In my Utf8Voodoo class there is a huge array of bytes from 127 to 255, aka - obsolete single-byte encodings of non-ASCII characters.
Then you iterate over bytes (not characters) in the strings and save points. Let me know if you would like more information.
source share