Как определить в .NET, является ли файл UCS-2 или UTF-16

У меня есть плоские файлы, которые я могу нормально загрузить в .NET в UTF-16, хотя технически они являются UCS2-LE (без спецификации), и я понимаю, что это потому, что UCS-2 является более старым стандартом, чем UTF-16. заменяет.

Однако меня интересует возможность определить, действительно ли файл является UCS-2. Я знаю, что это означает, что я буду гадать. Я пробовал .NET-порты chardet, IMultilang2 interop и некоторый открытый исходный код от Novell для попытки определить определение UCS-2 поверх UTF-16, и у меня не было никакого успеха. Я не нашел никакого метода, который мог бы определить разницу между UCS-2LE без спецификации и недействительным/сверхдлинным UTF-8.

Должен ли я проверять их байт за байтом и пытаться решить, является ли это кодировкой переменной или фиксированной длины? Может быть, искать недостающие кодовые точки? Проблема в том, что эти текстовые файлы не имеют специальных кодовых точек, они имеют только стандартный западный набор символов. Но TextPad сохраняет их как UCS2-LE без BOM, и это усложняет последующие файловые операции в нашем программном обеспечении, которое хочет, чтобы они были полностью совместимы с UTF-16 (и просто принудительная загрузка файлов работает, но не будет работать с требованиями программного обеспечения). ).


person Daniel Crenna    schedule 24.05.2012    source источник
comment
Это может помочь: https://lists.ubuntu.com/archives/bazaar/2007q2/025942.html Цитата: При интерпретации того, что люди имели в виду под UCS-2 в прошлом, лучше всего рассматривать его не как формат данных, а как указание на то, что реализация не интерпретирует никаких дополнительные символы. В частности, для целей обмена данными форматы UCS-2 и UTF-16 идентичны. Оба являются 16-разрядными и имеют точно такое же представление единиц кода.   -  person Jesse Harris    schedule 29.05.2012
comment
Это проблема; Я могу использовать существующие эвристики для обнаружения UTF-16, но эти реализации не могут определить UCS-2LE без файлов BOM. Я хочу относиться к ним одинаково, но в итоге мне приходится использовать резервную кодировку, потому что я не могу найти способ определить разницу.   -  person Daniel Crenna    schedule 03.06.2012


Ответы (1)


Этот раздел статьи в Википедии, http://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B0000_to_U.2BD7FF_and_U.2BE000_to_U.2BFFFF, говорит о базовой многоязычной плоскости, BMP. Все кодовые точки в BMP идентичны как для UTF-16, так и для UCS-2. Если TextPad просто кодирует BMP, вы можете рассматривать документ как UTF-16 или UCS-2.

Проблема возникает, когда закодированы кодовые точки вне BMP. UCS-2 не может представлять кодовые точки вне BMP. http://en.wikipedia.org/wiki/Universal_Character_Set#Encoding_forms_of_the_Universal_Character_Set Это может привести к предположению, что если кодовая точка находится за пределами BMP, то ее можно обрабатывать в UTF-16. Это могло быть проблематично, если программа, создающая файл, неправильно выполняла UCS-2 и использовала кодовые точки вне BMP по вспомогательным причинам.

Большинство библиотек и программ, которые читают UTF, позволяют указать, что делать, когда возникает ошибка кодирования, для каждого символа (создать исключение, заменить заполнителем, просто игнорировать). Если неправильный файл UCS-2 будет запущен через один из них как UTF-16, это вызовет ошибки. Понимание того, что автор файла пытался сделать вне BMP, было бы единственным способом справиться с ними надлежащим образом.

person Jesse Harris    schedule 05.06.2012
comment
Это все абсолютно правильно, но я не могу заставить такие инструменты, как порт .NET для chardet, IMultiLang2 и т. д., угадывать UTF-16 для любого файла UCS-2LE, когда нет спецификации. Это правильно, что TextPad просто хранит BMP, но я не могу заставить свое программное обеспечение понять это пуленепробиваемым способом. Тем не менее, это в основном ответ, в таких ситуациях я могу просмотреть файл и определить, находятся ли кодовые точки в BMP. Что мне не нравится, так это то, что я не могу найти эвристику, которая могла бы угадать это самостоятельно, когда нет спецификации. - person Daniel Crenna; 05.06.2012