Проблема с mojibake (японский сленг «mojibake» используется на английском языке, потому что исторический статус Японии как незападной страны с интенсивным использованием компьютера на ранних этапах означал, что проблема часто встречалась там) состоит в том, что персонажи обычнобыть достоверными сами по себе, но бессмыслица, которую гораздо сложнее обнаружить со 100% точностью.
Первое, что вам нужно сделать, - это определить кодировку, в которой действительно были данные, кодировку данных читали какнаходясь внутри, и напишите конвертер, чтобы отменить это.
Например, если UTF-8 был неверно истолкован как ISO 8859-1, то вы захотите прочитать поток и создать двоичный потоккодировать его обратно в ISO 8859-1, а затем создать текстовый поток для чтения этого двоичного потока как UTF-8, как и следовало бы сделать в первую очередь.
Теперь для трудной части, поискнеправильные потоки.Если вы можете сделать это с помощью средств, которые не являются эвристическими, то это правильный путь (например, если вы знали, что каждая запись, добавленная в определенный диапазон номеров идентификаторов, была недействительной, просто используйте это).
В противном случае, вам лучше всего выполнить некоторые эвристические операции следующим образом:
- Если символ в тексте не является графическим символом, то это, вероятно, вызвано этой проблемой с моджибаке.
- В данном случае моджибаке будут встречаться определенные последовательности.Например, é в UTF-8, неверно истолкованном как ISO 8859-1, станет à ©.Поскольку à © - чрезвычайно редкая комбинация в реальных данных (единственный случай, когда вы умышленно увидите это в таком случае, когда кто-то говорит о том, как это может выглядеть по ошибке), то любой текст, содержащий его, почти наверняка одинэто должно быть исправлено.Если у вас есть некоторые из исходных данных, вы можете найти последовательности, которые вам нужно искать, идентифицировав те символы в исходных данных, которые отличаются в двух кодировках, и создав необходимую последовательность (например, если мы обнаружим, что ç появляется в данныхи мы находим, что это будет иметь последовательность ç, тогда мы знаем, что это последовательность, которую нужно искать.
Обратите внимание, что мы можем вычислить такие последовательности, если у нас есть объекты System.Text.Encoding, которые соответствуютto mojikbake. Если, например, вы читали кодировку вашей системы по умолчанию, когда вы должны были читать как UTF-8, то вы можете использовать:
Encoding.Default.GetString(Encoding.UTF8.GetBytes(testString))
Например:
Encoding.Default.GetString(Encoding.UTF8.GetBytes("ç"))
возвращает «М».