Как определить, находится ли загруженный файл в UTF-8 или UTF-16? - PullRequest
1 голос
/ 23 июня 2011

У меня есть веб-сайт, где пользователь может загрузить текстовый файл данных, и данные будут импортированы в БД. Однако некоторые пользователи загружают данные в UTF-8, а другие загружают их в UTF-16.

    byte[] fileData = null;
    uploader.PostedFile.InputStream.Read(fileData, 0, length);
    data = TLCommon.EncodeJsString(System.Text.Encoding.UTF8.GetString(fileData));

Когда файл сохраняется в UTF-16 и загружается, данные являются мусором. Как я могу справиться с этой ситуацией?

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Вы можете использовать различные эвристики, например, проверять высокий процент 00 байт в потоке.(Они не будут присутствовать в UTF-8, но распространены в тексте UTF-16, который содержит символы ASCII.)

Это, однако, не может различить UTF-8 и Windows-1252, которыенесовместимые 8-битные кодировки, которые очень распространены в системах Windows на английском языке (США).Вы можете добавить больше проверок, таких как поиск байтовых последовательностей, которые являются недопустимыми в одной кодировке, но не в другой, но это становится очень сложным и обычно не различает разные однобайтовые кодировки.

Microsoft предоставляетбиблиотека с именем MLang , которая может автоматически обнаруживать UTF-8, UTF-16 и многие 8-битные кодовые страницы, используя статистический анализ байтов в потоке.Его точность довольно хороша, если у него достаточно большой образец текста для работы.Я написал о том, как использовать этот метод , и разместил полный исходный код на GitHub .

0 голосов
/ 23 июня 2011

Существует несколько опций, которые вы можете использовать: проверьте тип содержимого, чтобы увидеть, включает ли он параметр charset, который будет указывать кодировку (например, Content-Type: text/plain; charset=utf-16);проверьте, есть ли у загруженных данных спецификация (первые несколько байтов в файле, которые будут сопоставлены с символом Unicode U + FEFF - 2 байта для UTF-16, 3 для UTF-8) или если вы что-то знаете о файле(это первый символ, который должен быть ascii, например, в XML, начинающийся с '<'), затем вы можете использовать его, чтобы узнать кодировку.Но если у вас нет этих фрагментов информации, вам придется угадывать, используя некоторую эвристику. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...