2011-06-24 08:07:02 +0000 2011-06-24 08:07:02 +0000
74
74

Jak automatycznie wykryć kodowanie pliku tekstowego?

Istnieje wiele zwykłych plików tekstowych, które zostały zakodowane w różnych zestawach znaków.

Chcę je wszystkie przekonwertować do UTF-8, ale przed uruchomieniem iconv, muszę znać ich oryginalne kodowanie. Większość przeglądarek ma opcję Auto Detect w kodowaniach, jednak nie mogę sprawdzić tych plików tekstowych jeden po drugim, ponieważ jest ich zbyt wiele.

Tylko znając oryginalne kodowanie, mogę konwertować teksty przez iconv -f DETECTED_CHARSET -t utf-8.

Czy istnieje jakieś narzędzie do wykrywania kodowania zwykłych plików tekstowych? Nie musi być w 100% doskonały, nie przeszkadza mi to, że w 1 000 000 plików jest 100 plików źle przekonwertowanych.

Odpowiedzi (9)

62
62
62
2011-06-24 08:37:06 +0000

Wypróbuj moduł chardet Pythona, który jest dostępny na PyPi:

pip install chardet

Następnie uruchom chardetect myfile.txt.

Chardet jest oparty na kodzie wykrywania używanym przez Mozillę, więc powinien dać rozsądne wyniki, pod warunkiem, że tekst wejściowy jest wystarczająco długi do analizy statystycznej. Zapoznaj się z dokumentacją projektu .

Jak wspomniano w komentarzach, jest on dość powolny, ale niektóre dystrybucje dostarczają także oryginalną wersję C++, jak @Xavier znalazł w https://superuser.com/a/609056 . Gdzieś jest też wersja Java.

30
30
30
2013-06-18 12:44:37 +0000

Na Linuksie opartym na Debianie, pakiet uchardet Debian / Ubuntu ) dostarcza narzędzie wiersza poleceń. Zobacz poniżej opis pakietu:

universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
```.
16
16
16
2011-06-24 08:38:40 +0000

Dla Linuksa jest enca , a dla Solarisa możesz użyć auto_ef .

2
2
2
2013-10-11 16:06:44 +0000

Mozilla ma ładną bazę kodową 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

2
2
2
2018-11-06 15:42:35 +0000

Dla tych, którzy regularnie używają Emacsa, mogą znaleźć następujące użyteczne (pozwala na ręczne sprawdzenie i zatwierdzenie transfomacji).

Co więcej, często uważam, że autodetekcja zestawów znaków Emacsa jest znacznie bardziej wydajna niż inne narzędzia do autodetekcji zestawów znaków (takie jak chardet).

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

Wtedy, proste wywołanie Emacsa z tym skryptem jako argumentem (zobacz opcję “-l”) załatwia sprawę.

1
1
1
2015-10-28 17:34:06 +0000

isutf8 (z pakietu moreutils) wykonał zadanie

1
1
1
2014-01-23 16:12:16 +0000

Wracając do chardeta (python 2.?) to może wystarczy:

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Choć daleko mu do ideału….

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}
1
1
1
2011-09-03 00:48:04 +0000

UTFCast jest warty wypróbowania. U mnie nie zadziałał (może dlatego, że moje pliki są okropne), ale wygląda nieźle. http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/

0
0
0
2019-07-12 16:39:09 +0000

Również w przypadku, gdy plik -i daje ci nieznane

możesz użyć tej komendy php, która może odgadnąć charset jak poniżej :

W php możesz sprawdzić jak poniżej :

Określenie listy kodowań jawnie :

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Dokładniejsze “ mb_lista_kodowań”:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Tutaj w pierwszym przykładzie widać, że umieściłem listę kodowań (wykryj kolejność listy), które mogą być pasujące. Aby uzyskać dokładniejszy wynik, możesz użyć wszystkich możliwych kodowań poprzez : mb_list_encodings()

Uwaga funkcje mb_ wymagają php-mbstring

apt-get install php-mbstring

Zobacz odpowiedź : https://stackoverflow.com/a/57010566/3382822