Istnieje wiele zwykłych plików tekstowych zakodowanych w różnych zestawach znaków.
Chcę przekonwertować je wszystkie na UTF-8, ale przed uruchomieniem iconv muszę znać jego oryginalne kodowanie. Większość przeglądarek ma Auto Detect
opcję kodowania, jednak nie mogę sprawdzać tych plików tekstowych jeden po drugim, ponieważ jest ich zbyt wiele.
Znając tylko oryginalne kodowanie, mogę przekonwertować teksty iconv -f DETECTED_CHARSET -t utf-8
.
Czy jest jakieś narzędzie do wykrywania kodowania zwykłych plików tekstowych? NIE musi być w 100% perfekcyjny, nie mam nic przeciwko, jeśli 100 milionów plików jest źle przekonwertowanych.
python-chardet
w repozytorium wszechświata Ubuntu.chardet
nadal daje najbardziej prawidłowe zgadywanie, jak./a.txt: GB2312 (confidence: 0.99)
. W porównaniu do Enca, który właśnie zawiódł i zgłasza „Nierozpoznane kodowanie”. Niestety,chardet
działa bardzo wolno.chardet <(head -c4000 filename.txt)
było znacznie szybsze i równie udane w moim przypadku użycia. (w przypadku, gdy nie jest jasne, ta składnia bash wyśle tylko pierwsze 4000 bajtów do chardet)chardet==3.0.4
, a rzeczywista nazwa pliku narzędzia wiersza poleceniachardetect
nie jestchardet
.Użyłbym tego prostego polecenia:
Lub jeśli chcesz tylko rzeczywisty zestaw znaków (jak
utf-8
):źródło
file
wykrywa tylko kodowania o określonych właściwościach, takich jak UTF-8 lub UTF-16. Pozostałe - starsze ISO8859 lub ich odpowiedniki MS-DOS i Windows - są wymienione jako „nieznane - 8 bitów” lub coś podobnego, nawet w przypadku plikówchardet
wykrywanych z 99% pewnością.W systemie Linux opartym na Debianie pakiet uchardet ( Debian / Ubuntu ) zapewnia narzędzie wiersza poleceń. Zobacz opis opakowania poniżej:
źródło
uchardet
za pośrednictwem Homebrew.iconv
działa poprawnie.W systemie Linux jest enca, aw systemie Solaris można użyć auto_ef .
źródło
enca -d -L zh ./a.txt
komunikat nie powiódł się./a.txt: Unrecognized encoding Failure reason: No clear winner.
Jak wspomniano w @grawity,chardet
jest bardziej luźny, jednak jest zbyt wolny.Wracając do chardet (python 2.?) To wywołanie może wystarczyć:
Chociaż to dalekie od ideału ...
źródło
Dla tych, którzy regularnie używają Emacsa, mogą się przydać (pozwala to sprawdzić i ręcznie zweryfikować transfomację).
Ponadto często stwierdzam, że automatyczne wykrywanie zestawu znaków Emacsa jest znacznie wydajniejsze niż inne narzędzia do automatycznego wykrywania zestawu znaków (takie jak chardet).
Następnie wystarczy proste wywołanie Emacsa z tym skryptem jako argumentem (patrz opcja „-l”).
źródło
Warto spróbować UTFCast. Nie działało dla mnie (może dlatego, że moje pliki są okropne), ale wygląda dobrze.
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
źródło
Mozilla ma ładną bazę kodu do automatycznego wykrywania na stronach internetowych:
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
Szczegółowy opis algorytmu:
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
źródło
isutf8
(zmoreutils
paczki) wykonał zadanieźródło
Również w przypadku, gdy plik -i daje nieznane
Możesz użyć tego polecenia php, które może odgadnąć zestaw znaków, jak poniżej:
W php możesz sprawdzić jak poniżej:
Określając jawnie listę kodowania:
Dokładniejsze „ mb_list_encodings ”:
Tutaj w pierwszym przykładzie widać, że umieściłem listę kodowań (wykryj kolejność list), które mogą być zgodne. Aby uzyskać dokładniejszy wynik, możesz użyć wszystkich możliwych kodowań poprzez: mb_list_encodings ()
Uwaga Funkcje mb_ * wymagają php-mbstring
Zobacz odpowiedź: https://stackoverflow.com/a/57010566/3382822
źródło