Как обнаружить строки Unicode с непечатными символами? - PullRequest
1 голос
/ 02 октября 2010

У меня есть строки Unicode, хранящиеся в базе данных. Некоторые кодировки символов неверны, и вместо отображения реальных символов для языка теперь отображаются символы, которые не имеют смысла. Как я могу исправить эту проблему? Есть ли способ обнаружить, если строки имеют неправильную кодировку?

1 Ответ

3 голосов
/ 02 октября 2010

Проблема с mojibake (японский сленг «mojibake» используется на английском языке, потому что исторический статус Японии как незападной страны с интенсивным использованием компьютера на ранних этапах означал, что проблема часто встречалась там) состоит в том, что персонажи обычнобыть достоверными сами по себе, но бессмыслица, которую гораздо сложнее обнаружить со 100% точностью.

Первое, что вам нужно сделать, - это определить кодировку, в которой действительно были данные, кодировку данных читали какнаходясь внутри, и напишите конвертер, чтобы отменить это.

Например, если UTF-8 был неверно истолкован как ISO 8859-1, то вы захотите прочитать поток и создать двоичный потоккодировать его обратно в ISO 8859-1, а затем создать текстовый поток для чтения этого двоичного потока как UTF-8, как и следовало бы сделать в первую очередь.

Теперь для трудной части, поискнеправильные потоки.Если вы можете сделать это с помощью средств, которые не являются эвристическими, то это правильный путь (например, если вы знали, что каждая запись, добавленная в определенный диапазон номеров идентификаторов, была недействительной, просто используйте это).

В противном случае, вам лучше всего выполнить некоторые эвристические операции следующим образом:

  1. Если символ в тексте не является графическим символом, то это, вероятно, вызвано этой проблемой с моджибаке.
  2. В данном случае моджибаке будут встречаться определенные последовательности.Например, é в 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("ç"))

возвращает «М».

...