텍스트 파일의 인코딩을 어떻게 테스트합니까? 작동합니까? 그것은 무엇입니까?

텍스트 파일의 인코딩을 어떻게 테스트합니까? 작동합니까? 그것은 무엇입니까?

.htm열려 있는 파일이 여러 개 있습니다.편집자경고/오류는 없지만 에서 동일한 파일을 열면 Jedit잘못된 UTF-8 인코딩에 대한 경고가 표시됩니다...

HTML 메타 태그는 "charset=ISO-8859-1"을 선언합니다. Jedit 허용됨대체 인코딩 목록그리고인코딩 자동 감지기 목록(현재 "BOM XML-PI") 즉각적인 문제가 해결되었습니다. 하지만 생각이 들었습니다. 메타데이터가 존재하지 않으면 어떻게 될까요?

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

그리고 약간 다른 질문이지만 테스트할 수 있는 CLI 프로그램이 있습니까?모두 다 아는코딩?

답변1

file명령은 인코딩에서 "최상의 추측"을 사용합니다.

다음은 UTF-8로 인코딩된 독일어 발음 구별 부호가 포함된 파일의 데모입니다.

$ file umlaut-utf8.txt
umlaut-utf8.txt:     UTF-8 Unicode text

발음 구별 부호는 다른 두 인코딩에서 동일합니다.

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

세 가지가 모두 혼합되면 잘못된 인코딩이 발생합니다.

$ file umlaut-mixed.txt
umlaut-mixed.txt:    data

-i매개변수를 사용하여 MIME 유형으로 출력할 수 있습니다.

$ 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

(이것은 Mac에서도 마찬가지입니다 -I. Apple 개발자들은 다르게 생각하기 때문입니다.)

file명령은 매우 제한적입니다. 일부 바이트를 확인하고 인코딩이 무엇인지 추측하려고 시도합니다. 패턴을 인식하면 이것이 인코딩이라고 말합니다. 패턴을 인식하지 못하거나 인식한 패턴이 서로 충돌하는 경우 "데이터"(또는 MIME 형식의 바이너리)를 표시합니다. 이것이 본질적으로 의미하는 바는 유효한 인코딩을 인식할 수 없다는 것입니다.

이는 문자 및 움라우트의 분포를 기준으로 텍스트가 스페인어인지 프랑스어인지 식별하는 방법과 유사합니다. 수신한 텍스트의 문자 분포가 의미가 없는 경우 해당 텍스트가 "잘못된" 텍스트라고 결론을 내릴 수 있습니다. 하지만 그것은 이전에 한 번도 본 적이 없는 언어일 수도 있습니다. 이를 Lorem Ipsum과 비교해 보세요. 텍스트는바라보다자연스러운 텍스트와 비슷하지만 실제로는 의미가 없습니다.https://en.wikipedia.org/wiki/Lorem_ipsum

file다음은 올바른 인코딩이 인식되지 않는 예입니다.DOS 텍스트(블록 다이어그램 문자, CRLF 줄 종결자) 및 이스케이프 시퀀스가 ​​포함된 파일 보기

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


파일을 어떻게 생성합니까?

$ echo ä > umlaut-utf8.txt

이 줄을 복사하여 실행할 수 있습니다. utf8 움라우트가 포함된 파일을 생성해야 합니다.

16진수 덤프를 확인하세요.

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

다른 인코딩으로 변환:

$ 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

와 비교하다https://en.wikipedia.org/wiki/ä#Computer_encoding

세 가지를 모두 혼합하여 "잘못된" 항목을 만듭니다.

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

답변2

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

일부 인코딩에는 유효하지 않은 바이트 시퀀스가 ​​있으므로 확실히 제외될 수 있습니다. 이는 UTF-8의 경우 특히 그렇습니다. 대부분의 8비트 인코딩의 텍스트는 대부분 유효한 UTF-8이 아닙니다. isutf8다음을 사용하여 유효한 UTF-8을 테스트 할 수 있습니다 .더 많은 유틸리티또는 iconv -f utf-8 -t utf-8 >/dev/null등등.

일부 도구는 텍스트 파일의 인코딩을 추측하려고 시도합니다. 그들은 실수를 할 수 있지만, 당신이 그들을 속이려고 애쓰지 않는 한 그들은 대개 실제로 일합니다.

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

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

답변3

제 생각에는이것CLI 도구가 바로 여러분이 찾고 있는 것일 수도 있습니다!

Node.js와 NPM이 설치되어 있는지 확인하세요.

$ sudo apt install nodejs npm

CLI 설치:

$ npm install -g detect-file-encoding-and-language

CLI 사용:

$ dfeal "/home/user name/Documents/subtitle file.srt"
# Possible result: { language: french, encoding: CP1252, confidence: 0.99 }

답변4

또한 -i를 제출하면 알 수 없는 정보가 제공됩니다.

이 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

관련 정보