Jak mogę sprawdzić, które kodowanie jest używane w pliku


23

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?


piconvzmienić kodowanie;)
Rinzwind

Tak. Zmieniłem już kodowanie (w 1 pliku). Ale mam wiele z nich i chciałem stworzyć mały skrypt, który kontrolowałby wszystkie z nich, a następnie ukrywałby w razie potrzeby. Ale przypuszczam, że mogę po prostu przekonwertować je wszystkie. Żadna szkoda nie zostanie wyrządzona, jeśli niektóre są już w UTF-8. Dobrze?
NonStandardModel

Żaden problem nie :) Wystarczy użyć symbolu wieloznacznego
Rinzwind

Odpowiedzi:


26

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ć filepolecenia. 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.


ANSI nie jest tak naprawdę nazwą żadnego kodowania znaków. Być może myślisz o kodach specjalnych ANSI, które można wyrazić za pomocą kodowania znaków ASCII.
kasperd

@kasperd Najprawdopodobniej odnosi się do jednej z rodziny stron kodowych ISO 8859 lub Windows. Dla deweloperów systemu Windows w Ameryce Północnej kodowanie ANSI często oznacza kodowanie Windows 1252 ze względów historycznych.
user1937198

Tak, cóż, ANSI to w zasadzie ASCII (kody 0-127) oraz strona kodowa specyficzna dla ustawień regionalnych (kody 128-255). Więc masz rację ...
Bajt Dowódca

Więcej informacji: Co to jest format ANSI?
wjandrea

12

Nazwany program filemoż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.


2
W każdym razie może zgadywać .
hobbs

2
filezgaduje 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.
Mark

Świetnie 👌! Poświęciłem kilka godzin na znalezienie poprawnego kodowania mojego starego .sqlpliku i filepokazałem, że to rzeczywiście gzipplik skompresowany!
Amirreza Nasiri
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.