텍스트 파일 인코딩을 자동 감지하는 방법?


69

변형 문자셋으로 인코딩 된 일반 텍스트 파일이 많이 있습니다.

나는 그것들을 모두 UTF-8로 변환하고 싶지만 iconv를 실행하기 전에 원래 인코딩을 알아야합니다. 대부분의 브라우저에는 Auto Detect인코딩 옵션이 있지만 너무 많아서 텍스트 파일을 하나씩 확인할 수 없습니다.

원래 인코딩 만 알고 있으면로 텍스트를 변환 할 수 있습니다 iconv -f DETECTED_CHARSET -t utf-8.

일반 텍스트 파일의 인코딩을 감지하는 유틸리티가 있습니까? 100 % 완벽 할 필요는 없습니다. 1,000,000 개의 파일로 100 개의 파일이 잘못 변환 되어도 상관 없습니다.

답변:


57

PyPi에서 사용 가능한 chardet Python 모듈을 사용해보십시오 .

pip install chardet

그런 다음를 실행하십시오 chardetect myfile.txt.

Chardet은 Mozilla에서 사용 하는 감지 코드를 기반으로 하므로 입력 텍스트가 통계 분석에 충분할만큼 충분한 결과를 제공해야합니다. 프로젝트 문서를 읽으십시오 .

의견에서 언급했듯이 그것은 느리지 만 일부 배포판은 @Xavier가 https://superuser.com/a/609056 에서 찾은 원본 C ++ 버전도 제공 합니다. 어딘가에 Java 버전도 있습니다.


3
예, python-chardet우분투 유니버스 리포지토리 와 같이 이미 패키지되어 있습니다.
Xiè Jìléi

완벽한 추측이 아니더라도 chardet여전히 가장 정확한 추측을 할 것 ./a.txt: GB2312 (confidence: 0.99)입니다. 방금 실패한 Enca와 비교하여 '인식되지 않은 인코딩'을보고합니다. 그러나 슬프게도 chardet매우 느리게 실행됩니다.
Xiè Jìléi

1
@ 谢 继 雷 : 밤새 실행하거나 그런 식으로하세요. 캐릭터 세트 감지 입니다 복잡한 과정 . Java 기반 jChardet을 시도하거나 ... 원래 chardetMozilla의 일부 이지만 C ++ 소스 만 사용할 수 있으며 명령 행 도구는 없습니다.
grawity

2
속도와 관련하여 : 실행 chardet <(head -c4000 filename.txt)은 훨씬 더 빠르고 성공적으로 사용 사례에 성공했습니다. (경우에 chardet하는 첫 번째 4000 바이트를 보낼 것이 bash는 구문을 분명하지 않다)
ndemou

@ndemou 내가 가진 chardet==3.0.4및 명령 줄 도구의 실제 실행 파일 이름은 chardetect없습니다 chardet.
Devy

32

이 간단한 명령을 사용합니다.

encoding=$(file -bi myfile.txt)

또는 실제 문자 세트 만 원한다면 (예 utf-8:) :

encoding=$(file -b --mime-encoding myfile.txt)

4
불행히도 fileUTF-8 또는 UTF-16과 같은 특정 속성을 가진 인코딩 만 감지합니다. 오래된 ISO8859 또는 MS-DOS 및 Windows 통신 업체 인 나머지는 "알 수없는 8 비트"또는 이와 유사한 것으로 표시 chardet되며 99 % 신뢰도로 탐지되는 파일의 경우에도 마찬가지입니다 .
grawity

6
파일은 나에게 iso-8859-1을 보여 주었다
cweiske

연장 대가 누워 있으면 어떻게됩니까?
james.garriss

2
@ james.garriss : 파일 확장자는 (텍스트) 컨텐츠 인코딩과 관련이 없습니다.
MestreLion

29

데비안 기반 Linux에서 uchardet 패키지 ( Debian / Ubuntu )는 명령 줄 도구를 제공합니다. 아래 패키지 설명을 참조하십시오.

 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

3
감사! 프로젝트 홈페이지에서 CLI가 포함되어 있음이 분명하지 않았습니다. uchardetHomebrew 를 통해 설치할 때 OS X에서도 사용할 수 있습니다 .
Stefan Schmidt

1
ISO 8859-1 문서가 Windows-1252로 잘못 식별 되었기 때문에 처음에는 약간 혼란 스러웠지만 인쇄 가능한 범위에서 Windows-1252는 ISO 8859-1의 상위 집합이므로 변환이 제대로 iconv작동합니다.
Stefan Schmidt

16

Linux의 경우 enca가 있으며 Solaris의 경우 auto_ef 를 사용할 수 있습니다 .


Enca는 나에게 너무 엄격한 것 같습니다. enca -d -L zh ./a.txt메시지 실패 @grawity 가 ./a.txt: Unrecognized encoding Failure reason: No clear winner.언급했듯이 chardet더 느슨하지만 아직 느립니다.
Xiè Jìléi 2016 년

10
Enca는 "실제로 무언가를한다"는 시험에 완전히 실패했다.
Michael Wolf

1
uchardet이 실패했지만 (실제 CP1250 대신 CP1252가 감지 됨) enca가 제대로 작동했습니다. (단일 예, 일반화하기 어렵다 ...)
Palo


2

chardet (python 2?)으로 돌아가는 것으로 충분합니다.

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

완벽하지는 않지만 ....

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

2

Emacs를 정기적으로 사용하는 사람들은 다음과 같은 유용한 정보를 얻을 수 있습니다 (수동 변형을 수동으로 검사하고 검증 할 수 있음).

또한 종종 Emacs 문자 세트 자동 감지가 다른 문자 세트 자동 감지 도구 (예 : 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)
  )

그런 다음이 스크립트를 인수로 사용하여 Emacs를 간단히 호출하면 ( "-l"옵션 참조) 작업이 수행됩니다.



0

isutf8( moreutils패키지에서) 작업을 수행했습니다.


2
어떻게? 이 답변은 실제로 도움이되지 않습니다.
Moses

1
정확하게 요구 된 것은 아니지만 유용한 도구입니다. 파일이 유효한 UTF-8 인 경우 종료 상태는 0입니다. 파일이 유효한 UTF-8이 아니거나 오류가있는 경우 종료 상태는 0이 아닙니다.
ton

0

또한 -i를 제출하면 알 수없는 경우

아래와 같이 charset을 추측 할 수있는이 PHP 명령을 사용할 수 있습니다 :

PHP에서는 다음과 같이 확인할 수 있습니다.

인코딩 목록을 명시 적으로 지정 :

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

보다 정확한 " mb_list_encodings ":

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

여기 첫 번째 예에서 일치하는 인코딩 목록 (목록 순서 감지)을 넣었 음을 알 수 있습니다. 보다 정확한 결과를 얻으려면 다음을 통해 가능한 모든 인코딩을 사용할 수 있습니다. mb_list_encodings ()

mb_ * 함수에는 php-mbstring이 필요합니다

apt-get install php-mbstring 

답변보기 : https://stackoverflow.com/a/57010566/3382822

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.