경고 / 오류없이 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 bd
16 진)는 ý
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
- 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