it-swarm-ko.tech

텍스트 파일의 인코딩을 테스트하려면 어떻게해야합니까 ... 유효하고 무엇입니까?

나는 .htmGedit 파일에서 경고/오류없이 열리지 만 Jedit에서 동일한 파일을 열면 잘못된 UTF-8 인코딩이 경고됩니다 ...

HTML 메타 태그에는 "charset = ISO-8859-1"이 표시됩니다. Jedit는 대체 인코딩 목록 및 인코딩 자동 감지기 목록 목록을 허용합니다 (현재 "BOM XML-PI")이므로 즉시 문제가 해결되었습니다. 그러나 이것은 나를 생각하게했습니다 : 메타 데이터가 없다면 어떻게 될까요?

인코딩 정보를 사용할 수없는 경우 적용 할 수있는 인코딩 중 "최상의 추측"을 할 수있는 CLI 프로그램이 있습니까?

그리고 약간 다른 문제이지만; known 인코딩의 유효성을 테스트하는 CLI 프로그램이 있습니까?

55
Peter.O

file 명령은 인코딩에 대해 "최상의 추측"을합니다. -i 매개 변수를 사용하여 file가 인코딩에 대한 정보를 인쇄하게하십시오.

데모:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

파일을 생성 한 방법은 다음과 같습니다.

$ echo ä > umlaut-utf8.txt 

요즘 모든 것이 utf-8입니다. 그러나 스스로를 확신 시키십시오 :

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

https://en.wikipedia.org/wiki/Ä#Computer_encoding 와 비교

다른 인코딩으로 변환하십시오.

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

16 진 덤프를 확인하십시오.

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

세 가지를 모두 혼합하여 "유효하지 않은"것을 만듭니다.

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

file의 내용 :

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

-i없이 :

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

file 명령은 "valid"또는 "invalid"에 대해 전혀 모릅니다. 그것은 단지 몇 바이트를보고 인코딩이 무엇인지 추측하려고합니다. 인간으로서 우리는 파일이 "잘못된"인코딩으로 움라우트가있는 텍스트 파일임을 인식 할 수 있습니다. 그러나 컴퓨터로는 일종의 인공 지능이 필요합니다.

file의 휴리스틱은 일종의 인공 지능이라고 주장 할 수 있습니다. 그럼에도 불구하고 그것은 매우 제한적인 것입니다.

file 명령에 대한 자세한 내용은 다음과 같습니다. http://www.linfo.org/file_command.html

70
lesmana

텍스트 파일의 인코딩이 무엇인지 항상 확인할 수있는 것은 아닙니다. 예를 들어 바이트 시퀀스 \303\275 (16 진수의 c3 bd)는 UTF-8의 경우 ý, latin1의 경우 ý 또는 Ă˝, BIG-5에서는 등입니다.

일부 인코딩에는 잘못된 바이트 시퀀스가 ​​있으므로이를 확실하게 배제 할 수 있습니다. 이것은 특히 UTF-8에 해당합니다. 대부분의 8 비트 인코딩에서 대부분의 텍스트는 유효한 UTF-8이 아닙니다. moreutilsisutf8 또는 iconv -f utf-8 -t utf-8 >/dev/null를 사용하여 유효한 UTF-8을 테스트 할 수 있습니다.

텍스트 파일의 인코딩을 추측하는 도구가 있습니다. 그들은 실수를 할 수 있지만, 의도적으로 실수를 속이지 않는 한 실제로는 실제로 일합니다.

  • file
  • Perl Encode::Guess (표준 배포의 일부)는 바이트 문자열에서 연속 인코딩을 시도하고 문자열이 유효한 텍스트 인 첫 번째 인코딩을 반환합니다.
  • Enca 는 인코딩 추측 및 변환기입니다. 언어 이름과 텍스트가 해당 언어로되어 있다고 생각할 수 있으며 (지원되는 언어는 대부분 동유럽 언어 임) 인코딩을 추측하려고합니다.

파일에 메타 데이터 (HTML/XML charset=, TeX \inputenc, emacs -*-coding-*- 등)가있는 경우 Emacs 또는 Vim과 같은 고급 편집기는 종종 해당 메타 데이터를 구문 분석 할 수 있습니다. . 명령 행에서 자동화하는 것은 쉽지 않습니다.

또한 -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

1
Mohamed23gharbi