카테고리 보관물: Unix

Unix

텍스트 파일의 인코딩을 테스트하려면 어떻게해야합니까 … 유효하고 무엇입니까? 대체 인코딩 목록 과 자동

경고 / 오류없이 Gedit.htm 에서 여는 여러 파일이 있지만에서 동일한 파일을 열면 잘못된 UTF-8 인코딩에 대해 경고합니다 …Jedit

HTML 메타 태그에는 “charset = ISO-8859-1″이 표시됩니다. JEDIT은 허용 대체 인코딩 목록자동 감지기 인코딩 목록 내 즉각적인 문제가 해결 될 수 있도록, (현재는 “BOM의 XML-PI를”). 그러나 이것은 나를 생각하게했습니다 : 메타 데이터가 없다면 어떻게 될까요?

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

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



답변

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명령은 “유효”또는 “무효”의 아무 생각이 없습니다. 그것은 단지 몇 바이트를보고 인코딩이 무엇인지 추측하려고합니다. 인간으로서 우리는 파일이 “잘못된”인코딩으로 움라우트가있는 텍스트 파일임을 인식 할 수 있습니다. 그러나 컴퓨터로는 일종의 인공 지능이 필요합니다.

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

file명령 에 대한 자세한 정보는 다음과 같습니다 . http://www.linfo.org/file_command.html


답변

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

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

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

  • file
  • PerlEncode::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


답변