W pracy wydaje się, że żaden tydzień nie mija bez związanej z kodowaniem żałoby, nieszczęścia lub katastrofy. Problem zwykle pochodzi od programistów, którzy uważają, że mogą niezawodnie przetworzyć plik „tekstowy” bez określania kodowania. Ale nie możesz.
Postanowiono więc odtąd zabronić plikom kiedykolwiek nazw kończących się na *.txt
lub *.text
. Uważa się, że te rozszerzenia wprowadzają zwykłego programistę w tępe zadowolenie z kodowania, a to prowadzi do niewłaściwej obsługi. Prawie lepiej byłoby nie mieć żadnego rozszerzenia, ponieważ przynajmniej wtedy wiesz , że nie wiesz, co masz.
Jednak nie posuniemy się tak daleko. Zamiast tego oczekuje się, że użyjesz nazwy pliku, która kończy się kodowaniem. Więc dla plików tekstowych, na przykład, to byłoby coś README.ascii
, README.latin1
, README.utf8
, itd.
W przypadku plików wymagających określonego rozszerzenia, jeśli można określić kodowanie w samym pliku, na przykład w Perlu lub Pythonie, należy to zrobić. W przypadku plików takich jak źródło Java, w przypadku których nie istnieje taka funkcja wewnątrz pliku, kodowanie należy umieścić przed rozszerzeniem, takim jak SomeClass-utf8.java
.
W przypadku wyjścia zdecydowanie preferowany jest UTF-8 .
Ale aby wprowadzić dane, musimy dowiedzieć się, jak radzić sobie z tysiącami plików w naszej bazie kodu o nazwie *.txt
. Chcemy zmienić ich nazwy, aby pasowały do naszego nowego standardu. Ale nie możemy ich wszystkich przyjrzeć. Potrzebujemy więc biblioteki lub programu, który faktycznie działa.
Są różne w ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 lub Apple MacRoman. Chociaż wiemy, że możemy stwierdzić, czy coś jest ASCII, i znosimy dobrą zmianę, wiedząc, czy coś jest prawdopodobnie UTF-8, jesteśmy zaskoczeni kodowaniem 8-bitowym. Ponieważ pracujemy w mieszanym środowisku Unix (Solaris, Linux, Darwin), gdzie większość komputerów stacjonarnych to komputery Mac, mamy sporo irytujących plików MacRoman. A to szczególnie stanowi problem.
Od jakiegoś czasu szukałem sposobu, aby programowo określić, który z nich
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
plik się znajduje, a nie znalazłem programu ani biblioteki, która mogłaby niezawodnie rozróżnić te trzy różne 8-bitowe kodowanie. Prawdopodobnie mamy ponad tysiąc samych plików MacRoman, więc niezależnie od używanego przez nas detektora znaków, musi być w stanie je wykryć. Nic, na co patrzyłem, nie poradzi sobie z tą sztuczką. Miałem duże nadzieje co do biblioteki do wykrywania zestawów znaków ICU , ale nie radzi sobie ona z MacRomanem. Przyjrzałem się także modułom, które wykonują to samo w Perlu i Pythonie, ale zawsze jest to ta sama historia: brak obsługi wykrywania MacRoman.
Dlatego szukam istniejącej biblioteki lub programu, który niezawodnie określa, w którym z tych pięciu kodowań znajduje się plik - a najlepiej więcej. W szczególności musi rozróżniać trzy 3-bitowe kodowanie, które zacytowałem, zwłaszcza MacRoman . Pliki zawierają ponad 99% tekstu w języku angielskim; jest kilka w innych językach, ale niewiele.
Jeśli jest to kod biblioteki, preferujemy język Perl, C, Java lub Python i w tej kolejności. Jeśli jest to tylko program, to nie obchodzi nas, w jakim języku jest, o ile jest w pełnym kodzie źródłowym, działa w systemie Unix i jest całkowicie wolny od obciążeń.
Czy ktoś inny miał ten problem z milionami starszych plików tekstowych, które zostały losowo zakodowane? Jeśli tak, w jaki sposób próbowałeś go rozwiązać i jaki był sukces? To jest najważniejszy aspekt mojego pytania, ale interesuje mnie również, czy myślisz, że zachęcanie programistów do nadawania nazw (lub zmiany nazwy) swoich plików za pomocą faktycznego kodowania tych plików pomoże nam uniknąć problemu w przyszłości. Czy ktokolwiek próbował wyegzekwować to na zasadach instytucjonalnych, a jeśli tak, to czy to się udało, czy nie, i dlaczego?
I tak, w pełni rozumiem, dlaczego nie można zagwarantować jednoznacznej odpowiedzi, biorąc pod uwagę naturę problemu. Dotyczy to zwłaszcza małych plików, w przypadku których nie masz wystarczającej ilości danych, aby kontynuować. Na szczęście nasze pliki rzadko są małe. Oprócz README
plików losowych większość ma rozmiar od 50 KB do 250 KB, a wiele z nich jest większych. Wszystko, co przekracza kilka K, na pewno będzie w języku angielskim.
Domeną problemu jest eksploracja tekstu biomedycznego, więc czasami mamy do czynienia z rozległymi i bardzo dużymi korpusami, takimi jak wszystkie repozytorium Open Access PubMedCentral. Dość dużym plikiem jest BioThesaurus 6.0 o rozmiarze 5,7 gigabajta. Ten plik jest szczególnie denerwujący, ponieważ prawie cały jest UTF-8. Jednak jakiś numbskull poszedł i umieścił w nim kilka wierszy, które są w 8-bitowym kodowaniu - chyba Microsoft CP1252. Trwa trochę czasu, zanim się na niego potkniesz. :(