Jak wykryć kodowanie pliku?

115

W moim systemie plików (Windows 7) mam kilka plików tekstowych (jeśli są to pliki skryptowe SQL).

Po otwarciu za pomocą Notepad ++ , w menu „Kodowanie” niektóre z nich mają kodowanie „UCS-2 Little Endian”, a niektóre „UTF-8 bez BOM”.

Jaka jest tutaj różnica? Wszystkie wydają się być całkowicie poprawnymi skryptami. Jak mogę określić, jakie kodowania ma plik bez Notepad ++?

Marcel
źródło
7
Jest całkiem prosty sposób korzystania z Firefoksa. Otwórz plik za pomocą przeglądarki Firefox, a następnie Widok> Kodowanie znaków. Szczegółowe tutaj .
Catherine Gasnier
użyj heurystyki. kasa encai chardetdla systemów POSIX.
Janus Troelsen
3
Myślę, że alternatywną odpowiedzią jest TRIAL i ERROR. iconvw szczególności jest przydatny do tego celu. Zasadniczo iterujesz uszkodzone ciągi znaków / tekst przez różne kodowania, aby zobaczyć, który z nich działa. Wygrywasz, gdy postacie nie są już zepsute. Chciałbym tutaj odpowiedzieć, podając programowy przykład. Ale to niestety pytanie chronione.
Brandon Bertelsen,
FF korzysta z detektorów zestawu znaków Mozilli . Innym prostym sposobem jest otwarcie pliku słowem MS, odgadnie pliki całkiem poprawnie nawet dla różnych starożytnych
stron kodowych w
Jeśli chardetlub chardetectnie jest dostępny w twoim systemie, możesz zainstalować pakiet za pomocą menedżera pakietów (np. apt search chardet- na Ubuntu / debian pakiet jest zwykle wywoływany python-chardetlub python3-chardet) lub przez pip z pip install chardet(lub pip install cchardetdla szybszej wersji zoptymalizowanej pod kątem c).
ccpizza

Odpowiedzi:

97

Pliki zazwyczaj wskazują ich kodowanie za pomocą nagłówka pliku. Istnieje wiele przykładów tutaj . Jednak nawet po przeczytaniu nagłówka nigdy nie możesz być pewien, jakiego kodowania plik naprawdę używa .

Na przykład plik z pierwszymi trzema bajtami 0xEF,0xBB,0xBFjest prawdopodobnie plikiem zakodowanym w UTF-8. Może to jednak być plik ISO-8859-1, który zaczyna się od znaków . Lub może to być całkowicie inny typ pliku.

Notepad ++ stara się odgadnąć, jakiego kodowania używa plik i przez większość czasu robi to dobrze. Czasami robi się źle - dlatego menu „Kodowanie” jest dostępne, więc możesz pominąć jego najlepsze przypuszczenia.

W przypadku dwóch wymienionych kodowań:

  • Pliki „UCS-2 Little Endian” są plikami UTF-16 (na podstawie tego, co rozumiem z informacji tutaj ), więc prawdopodobnie zaczynają się 0xFF,0xFEod pierwszych 2 bajtów. Z tego, co mogę powiedzieć, Notepad ++ opisuje je jako „UCS-2”, ponieważ nie obsługuje niektórych aspektów UTF-16.
  • Pliki „UTF-8 bez BOM” nie mają żadnych bajtów nagłówka. To właśnie oznacza bit „bez BOM”.
Vaughandroid
źródło
2
Dlaczego plik rozpoczynający się od BOM ma być automatycznie wykrywany jako „UTF-8 bez BOM”?
Michael Borgwardt,
2
A jeśli plik zaczynał się od 0xFF, 0xFE, powinien zostać automatycznie wykryty jako UTF-16, a nie UCS-2. UCS-2 prawdopodobnie się domyśla, ponieważ zawiera głównie znaki ASCII, a zatem każdy inny bajt ma wartość NULL.
Michael Borgwardt
2
Z doświadczeniem niestety metadane („nagłówki”) również mogą być błędne. Baza danych zawierająca informacje może być uszkodzona lub pierwotny przesyłający mógł się pomylić. (Był to dla nas poważny problem w ciągu ostatnich kilku miesięcy; niektóre dane zostały przesłane jako „UTF-8”, z wyjątkiem tego, że to „naprawdę ISO8859-1, ponieważ są one takie same ?!” Bah! Naukowcy powinni być zachowani od początku tworzenia metadanych; po prostu źle to rozumieją ...)
Donal Fellows
1
Właściwie myślę, że to „zabawne”, że problem z kodowaniem nadal występuje w 2014 roku, ponieważ żaden plik na świecie nie rozpocznie się od „ï» ¿”i jestem bardzo zaskoczony, gdy widzę stronę HTML, która została załadowana z niewłaściwym kodowaniem. To kwestia prawdopodobieństwa. Nie jest możliwe wybranie niewłaściwego kodowania, jeśli inne kodowanie uniknęłoby dziwnych znaków. Szukanie kodowania, które pozwala uniknąć dziwnych znaków, działałoby w 99,9999% przypadków. Ale nadal występują błędy .. Również bardzo mylące jest używanie ascii zamiast UTF8 w celu zaoszczędzenia miejsca .. to mylące młodszych programistów ten pomysł na wykonanie ..
Revious
18

Nie możesz. Gdybyś mógł to zrobić, nie byłoby tak wielu stron internetowych lub plików tekstowych z „losowym bełkotem”. Dlatego kodowanie jest zwykle wysyłane wraz z ładunkiem jako metadane.

W przeciwnym razie można jedynie „zgadnąć”, ale wynik jest często niejednoznaczny, ponieważ ta sama sekwencja bajtów może być poprawna w kilku kodowaniach.

Marco
źródło
2
OK, więc czy system operacyjny Windows przechowuje te informacje (metadane) gdzieś? Prawdopodobnie w rejestrze?
Marcel
Jesteś w błędzie. To są strony kodowe - niezupełnie takie same. Istnieją algorytmy do odgadnięcia w kodowaniu Unicode.
DeadMG,
6
@Marcel: Nie. Dlatego „pliki tekstowe” są tak problematyczne dla wszystkiego oprócz czystego ASCII.
Michael Borgwardt,
cóż, notatnik ++ może to zrobić, może powiedzieć, czy plik tekstowy jest zakodowany w utf-8, czy nie
user25