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 ++?
enca
ichardet
dla systemów POSIX.iconv
w 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.chardet
lubchardetect
nie 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ływanypython-chardet
lubpython3-chardet
) lub przez pip zpip install chardet
(lubpip install cchardet
dla szybszej wersji zoptymalizowanej pod kątem c).Odpowiedzi:
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,0xBF
jest 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ń:
0xFF,0xFE
od 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.źródło
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.
źródło