Как надежно угадать кодировку между MacRoman, CP1252, Latin1, UTF-8 и ASCII

На работе кажется, что ни одна неделя не проходит без какой-нибудь потворства, связанной с кодированием, бедствия или катастрофы. Проблема обычно исходит от программистов, которые думают, что могут надежно обработать «текстовый» файл без указания кодировки. Но вы не можете.

Поэтому отныне было решено запретить файлам иметь имена, заканчивающиеся на *. Txt или *. Text . Считается, что эти расширения вводят в заблуждение случайного программиста до тупого самоуспокоения относительно кодирования, а это приводит к неправильной обработке. Было бы почти лучше не иметь Было решено отныне запретить файлам иметь имена, оканчивающиеся на * .txt или *. text . Считается, что эти расширения вводят в заблуждение случайного программиста до тупого самоуспокоения относительно кодирования, а это приводит к неправильной обработке. Было бы почти лучше не иметь Было решено отныне запретить файлам иметь имена, оканчивающиеся на * .txt или *. text . Считается, что эти расширения вводят в заблуждение случайного программиста до тупого самоуспокоения относительно кодирования, а это приводит к неправильной обработке. Было бы почти лучше не иметь расширение вообще, потому что по крайней мере тогда вы знаете , что не знаете, что у вас есть.

Однако мы не собираемся заходить так далеко. Вместо этого вы должны будете использовать имя файла, оканчивающееся на кодировку. Так, для текстовых файлов, например, это будет что-то вроде README.ascii , README.latin1 , README.utf8 и т. Д.

Для файлов которые требуют определенного расширения, если можно указать кодировку внутри самого файла, например, в Perl или Python, вы должны это сделать. Для файлов, таких как исходный код Java, в которых нет такой возможности внутри файла, вы поместите кодировку перед расширением, например SomeClass-utf8.java .

Для вывода UTF-8 должен быть настоятельно рекомендуется .

Но для ввода нам нужно выяснить, как работать с тысячами файлов в нашей кодовой базе с именем *. txt . Мы хотим переименовать их все, чтобы они соответствовали нашему новому стандарту. Но мы не можем рассматривать их всех. Поэтому нам нужна библиотека или программа, которые действительно работают.

Они бывают разными в ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 или Apple MacRoman. Несмотря на то, что мы знаем, что можем определить, является ли что-то ASCII, и у нас есть хорошая возможность узнать, вероятно ли что-то в UTF-8, насчет 8-битных кодировок нас не интересует. Поскольку мы работаем в смешанной среде Unix (Solaris, Linux, Darwin) с большинством настольных компьютеров Mac, у нас довольно много надоедливых файлов MacRoman. И это особенно проблема.

В течение некоторого времени я искал способ программно определить, какой из

  1. ASCII
  2. ISO-8859-1
  3. CP1252
  4. MacRoman
  5. UTF-8

a файл находится внутри, и я не нашел программы или библиотеки, которые могли бы надежно различать эти три разные 8-битные кодировки. У нас, вероятно, есть только более тысячи файлов MacRoman, поэтому какой бы детектор кодировки мы ни использовали, он должен уметь их обнаруживать. Ничего из того, на что я смотрел, не помогло. Я возлагал большие надежды на библиотеку детекторов кодировки ICU , но она не может работать с MacRoman. Я также смотрел модули, которые делают то же самое как в Perl, так и в Python, но снова и снова это всегда одна и та же история: нет поддержки для обнаружения MacRoman.

То, что я ищу, - это существующая библиотека или программа, которая надежно определяет, в какой из этих пяти кодировок находится файл - и желательно больше. В частности, он должен различать три 3-битных кодировки, которые я процитировал, особенно MacRoman . Файлы содержат более 99% текста на английском языке; есть несколько на других языках, но не много.

Если это библиотечный код, мы предпочитаем, чтобы он был на Perl, C, Java или Python и именно в таком порядке. Если это просто программа, то нам все равно, на каком языке она написана, если она идет в полном исходном коде, работает на Unix и полностью свободна.

У кого-нибудь еще была эта проблема с миллионом старых текстовых файлов кодируется случайным образом? Если да, то как вы пытались ее решить, и насколько вы были успешны? Это самый важный аспект моего вопроса, но меня также интересует, считаете ли вы, что поощрение программистов называть (или переименовывать) свои файлы с фактической кодировкой, в которой находятся эти файлы, поможет нам избежать проблемы в будущем. Пробовал ли кто-нибудь когда-либо принудить к соблюдению этого на институциональной основе, и если да, было ли это успешным или нет, и почему?

И да, я полностью понимаю, почему нельзя гарантировать однозначный ответ, учитывая характер проблемы. Это особенно касается небольших файлов, где у вас недостаточно данных для продолжения. К счастью, наши файлы редко бывают маленькими. За исключением случайного файла README , большинство из них имеют размер от 50 до 250 КБ, а многие больше. Все, что превышает несколько килобайт, гарантированно будет на английском языке.

Проблемной областью является биомедицинский анализ текста, поэтому мы иногда имеем дело с обширными и чрезвычайно большими корпусами, как и все репозитории открытого доступа PubMedCentral. Довольно огромный файл - это BioThesaurus 6.0, размером 5,7 гигабайт. Этот файл особенно раздражает, потому что он почти полностью UTF-8. Однако какой-то тупица пошел и засунул в него несколько строк в какой-то 8-битной кодировке - мне кажется, Microsoft CP1252. Прежде чем вы наткнетесь на него, пройдет немало времени. : (

97
задан Jonas 3 February 2011 в 23:43
поделиться