На работе кажется, что ни одна неделя не проходит без каких-либо потасовок, связанных с кодированием, бедствий или катастроф. Проблема обычно исходит от программистов, которые думают, что могут надежно обработать «текстовый» файл без указания кодировки. Но ты не можешь.
Поэтому отныне было решено запретить файлам иметь имена, оканчивающиеся на *.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. И это особенно проблема.
Некоторое время я искал способ программно определить, какой из
- ASCII
- ISO-8859-1
- CP1252
- МакРоман
- UTF-8
файл находится внутри, и я не нашел программы или библиотеки, которые могли бы надежно различить эти три различных 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. Прежде чем вы наткнетесь на него, пройдет немало времени. :(