На работе кажется, что ни одна неделя не проходит без каких-либо потрясений, бедствий или катастроф, связанных с кодированием. Проблема обычно исходит от программистов, которые думают, что они могут надежно обрабатывать «текстовые» файлы без указания кодировки. Но ты не можешь.
Поэтому было решено отныне запретить файлам иметь имена, заканчивающиеся на *.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
- 1033 * кодировка CP1252 *
- MacRoman
- UTF-8
файл находится в, и я не нашел программу или библиотеку, которая могла бы надежно различать эти три различных 8-битных кодирования. У нас, вероятно, есть более тысячи файлов MacRoman, поэтому любой используемый нами детектор кодировки должен уметь их обнаруживать. Ничто из того, на что я смотрел, не может справиться с этим. У меня были большие надежды на библиотеку ICS , но она не может справиться с 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.Это займет довольно много времени, прежде чем вы отправитесь на этом.(