На роботі здається, що жоден тиждень не проходить без конічності, катастрофи чи катастрофи. Проблема зазвичай виникає у програмістів, які думають, що вони можуть надійно обробити "текстовий" файл, не вказуючи кодування. Але ти не можеш.
Тому було вирішено відтепер забороняти файлам мати імена, які закінчуються на *.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), а більшість настільних комп'ютерів є Macs, у нас є досить багато роздратованих файлів MacRoman. І це особливо є проблемою.
Деякий час я шукаю спосіб програмно визначити, який із них
- ASCII
- ISO-8859-1
- CP1252
- Макроман
- UTF-8
файл є, і я не знайшов програми чи бібліотеки, які б надійно розмежували між цими трьома різними 8-бітовими кодуваннями. Ми, мабуть, маємо понад тисячу файлів MacRoman, тому будь-який детектор шаблонів ми використовуємо, щоб мати можливість обнюхати їх. Ніщо, на що я дивився, не може керувати фокусом. Я покладав великі надії на бібліотеку детекторів мікросхем ICU , але вона не може впоратися з MacRoman. Я також дивився на модулі, щоб робити те саме, що і в Perl і Python, але знову і знову це завжди та сама історія: ніякої підтримки для виявлення MacRoman.
Тому я шукаю існуючу бібліотеку чи програму, яка надійно визначає, у котрому з цих п'яти кодувань знаходиться файл - і бажано більше того. Зокрема, він повинен розрізняти три цитові кодування, які я цитував, особливо MacRoman . Файли - це понад 99% тексту англійською мовою; є кілька інших мов, але не багато.
Якщо це код бібліотеки, наша мовна перевага полягає в тому, щоб він знаходився в Perl, C, Java або Python, і в такому порядку. Якщо це просто програма, то нас насправді не цікавить, на якій мові вона знаходиться, якщо вона надходить у повноцінний джерело, працює на Unix і повністю не обмежена.
Хто-небудь ще мав цю проблему із зільйоном застарілих текстових файлів, випадково закодованих? Якщо так, то як ви намагалися вирішити це та наскільки успішними були ви? Це найважливіший аспект мого питання, але я також зацікавлений у тому, чи вважаєте ви, що заохочення програмістів назвати (або перейменувати) свої файли за допомогою фактичного кодування цих файлів допоможе нам уникнути проблеми в майбутньому. Хтось коли-небудь намагався застосувати це на інституційній основі, і якщо так, то було це успішно чи ні, і чому?
І так, я повністю розумію, чому не можна гарантувати однозначну відповідь, враховуючи характер проблеми. Особливо це стосується невеликих файлів, де у вас немає достатньої кількості даних. На щастя, наші файли рідко малі. Крім випадкового README
файлу, більшість знаходяться в діапазоні розмірів від 50 до 250 К, а багато з них - більші. Все, що має розмір більше декількох K, гарантується англійською мовою.
Проблемною областю є видобуток біомедичного тексту, тому ми іноді маємо справу з великими та надзвичайно великими корпораціями, як і у всіх сховищах відкритого доступу PubMedCentral. Досить величезний файл - це BioThesaurus 6.0, розміром 5,7 гігабайт. Цей файл особливо дратує, оскільки він майже весь UTF-8. Однак деякі numbskull пішли і застрягли в ньому кілька рядків, які знаходяться в якомусь 8-бітному кодуванні - Microsoft CP1252, я вважаю. Мине досить багато часу, перш ніж поїхати на цьому. :(