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

Hoe automatisch tekstbestand encoding detecteren?

Er zijn veel platte tekst bestanden die werden gecodeerd in verschillende karaktersets.

Ik wil ze allemaal omzetten naar UTF-8, maar voordat ik iconv start, moet ik de originele encoding weten. De meeste browsers hebben een Auto Detect optie in encodings, maar ik kan die tekst bestanden niet een voor een controleren omdat het er te veel zijn.

Alleen als ik de oorspronkelijke codering weet, kan ik de teksten met iconv -f DETECTED_CHARSET -t utf-8 omzetten.

Is er een hulpprogramma om de codering van platte tekst bestanden te detecteren? Het hoeft NIET 100% perfect te zijn, het maakt me niet uit als er 100 bestanden verkeerd gecodeerd zijn in 1.000.000 bestanden.

Antwoorden (9)

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

Probeer de chardet Python module, die beschikbaar is op PyPi:

pip install chardet

Voer dan chardetect myfile.txt uit.

Chardet is gebaseerd op de detectiecode die Mozilla gebruikt, dus het zou redelijke resultaten moeten geven, mits de ingevoerde tekst lang genoeg is voor statistische analyse. Lees wel de projectdocumentatie .

Zoals vermeld in de commentaren is het vrij traag, maar sommige distributies leveren ook de originele C++ versie zoals @Xavier heeft gevonden in https://superuser.com/a/609056 . Er is ook ergens een Java versie.

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

Op Debian-gebaseerde Linux, biedt het uchardet pakket Debian / Ubuntu ) een opdrachtregelgereedschap. Zie hieronder de beschrijving van het pakket:

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

Voor Linux is er enca en voor Solaris kunt u auto_ef gebruiken.

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

Mozilla heeft een mooie codebase voor autodetectie in webpagina’s: http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/

Gedetailleerde beschrijving van het algoritme: http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

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

Voor degenen die regelmatig Emacs gebruiken, is het volgende misschien nuttig (om de transfomatie handmatig te inspecteren en te valideren).

Bovendien vind ik vaak dat de Emacs char-set auto-detectie veel efficiënter is dan de andere char-set auto-detectie tools (zoals 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)
  )

Dan is een simpele aanroep aan Emacs met dit script als argument (zie de “-l” optie) voldoende.

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

isutf8 (uit het moreutils pakket) deed het werk

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

Terugkomend op chardet (python 2.?) zou deze aanroep kunnen volstaan:

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

Hoewel het verre van perfect is….

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 is het proberen waard. Het werkte niet voor mij (misschien omdat mijn bestanden verschrikkelijk zijn) maar het ziet er goed uit. 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

Ook in het geval u dossier -i u onbekende

geeft U kunt dit php-bevel gebruiken dat charset zoals hieronder kan raden:

In php kun je het controleren zoals hieronder:

Coderingslijst expliciet opgeven :

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

Meer nauwkeurig “ mblistencodings”:

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

Hier in het eerste voorbeeld, kun je zien dat ik een lijst van coderingen heb gezet (detecteer lijst volgorde) die overeen zouden kunnen komen. Om een nauwkeuriger resultaat te krijgen kunt u alle mogelijke coderingen gebruiken via : mb_listencodings()_

Opmerking mb_* functies vereisen php-mbstring

apt-get install php-mbstring

Zie antwoord : https://stackoverflow.com/a/57010566/3382822