Miałem pewne problemy z plikami napisów w wideo omxplayer. Aby go rozwiązać, musiałem przekonwertować kodowanie z systemu Windows-1250 na kodowanie UTF-8. Moje pytanie brzmi: jak mogę sprawdzić konkretny plik, którego kodowania się używa?
Miałem pewne problemy z plikami napisów w wideo omxplayer. Aby go rozwiązać, musiałem przekonwertować kodowanie z systemu Windows-1250 na kodowanie UTF-8. Moje pytanie brzmi: jak mogę sprawdzić konkretny plik, którego kodowania się używa?
Odpowiedzi:
Naprawdę nie możesz automatycznie dowiedzieć się, czy plik został pierwotnie zapisany z kodowaniem X.
Możesz jednak łatwo sprawdzić, czy cały plik można w jakiś sposób pomyślnie zdekodować (ale niekoniecznie poprawnie) przy użyciu określonego kodeka. Jeśli znajdziesz jakieś bajty, które nie są poprawne dla danego kodowania, musi to być coś innego.
Problem polega na tym, że wiele kodeków jest podobnych i ma takie same „prawidłowe wzorce bajtów”, po prostu interpretując je jako różne znaki. Na przykład ä
kodowanie w jednym może odpowiadać é
w innym lub ø
w trzecim. Komputer tak naprawdę nie może wykryć, w jaki sposób interpretować bajt, powoduje, że tekst jest czytelny dla człowieka (chyba że dodasz słownik dla wszystkich języków i pozwoli ci sprawdzić pisownię ...). Musisz także wiedzieć, że niektóre zestawy znaków są tak naprawdę podzestawami innych, jak np. Kodowanie ASCII jest częścią najczęściej używanych kodeków, takich jak niektóre rodziny ANSI lub UTF-8. Oznacza to na przykład tekst zapisany jako UTF-8, który zawiera tylko proste znaki łacińskie, byłby identyczny z tym samym plikiem zapisanym jako ASCII.
Wróćmy jednak od wyjaśnienia, czego nie możesz zrobić, do tego, co możesz zrobić:
Aby przeprowadzić podstawowe sprawdzenie plików tekstowych ASCII / innych niż ASCII (zwykle UTF-8), możesz użyć file
polecenia. Nie zna jednak wielu kodeków i sprawdza tylko kilka pierwszych KB pliku, zakładając, że reszta nie będzie zawierała żadnych nowych znaków. Z drugiej strony rozpoznaje także inne popularne typy plików, takie jak różne skrypty, dokumenty HTML / XML i wiele formatów danych binarnych (co nie jest interesujące przy porównywaniu plików tekstowych) i może wydrukować dodatkowe informacje, czy są to wyjątkowo długie linie, czy co stosowany jest typ sekwencji nowej linii (np. UNIX: LF, Windows: CR + LF).
$ cat ascii.txt
I am an ASCII file.
Just text and numb3rs and simple punctuation...
$ cat utf8.txt
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!
$ file ascii.txt utf8.txt
ascii.txt: ASCII text
utf8.txt: UTF-8 Unicode text
Jeśli to nie wystarczy, mogę zaoferować ci skrypt Pythona, który napisałem dla tej odpowiedzi tutaj , który skanuje pełne pliki i próbuje je odkodować przy użyciu określonego zestawu znaków. Jeśli się powiedzie, to kodowanie jest potencjalnym kandydatem. W przeciwnym razie, jeśli istnieją bajty, których nie można dekodować, można usunąć ten zestaw znaków z listy.
Nazwany program file
może to zrobić. Przykład:
$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators
Jeśli interesuje Cię jak to się robi zobacz src/encoding.c
.
file
zgaduje i często nie jest to zbyt dobry pomysł. Na przykład w moich testach błędnie zidentyfikował zarówno MacRoman, jak i CP-1252 jako ISO-8859, w wyniku czego „š” i „ß” zostały zakodowane.
.sql
pliku i file
pokazałem, że to rzeczywiście gzip
plik skompresowany!
piconv
zmienić kodowanie;)