iconv 잘못된 입력 순서-왜?


14

텍스트 파일을 ASCII 파일로 변환하려고 할 때 오류 메시지가 나타납니다 iconv: illegal input sequence at position.

내가 사용하는 명령은 iconv -f UTF-8 -t ascii//TRANSLIT file

문제가되는 캐릭터는 æ입니다.

텍스트 파일 자체가 여기에 있습니다 .

왜 잘못된 순서라고 말합니까? 입력 문자는 올바른 UTF-8 문자 (U + 00E6)입니다.

답변:


17

파일은 UTF-8이 아닌 ISO-8859-1로 인코딩됩니다.

$ hd 0606461.txt | grep -B1 '^0002c520'
0002c510  64 75 6d 20 66 65 72 69  65 6e 74 20 72 75 69 6e  |dum ferient ruin|
0002c520  e6 0d 0a 2d 2d 48 6f 72  61 63 65 2e 0d 0a 0d 0a  |...--Horace.....|

바이트 "e6"만으로는 유효한 UTF-8 시퀀스가 ​​아닙니다.

따라서을 사용하십시오 iconv -f latin1 -t ascii//TRANSLIT file.


문제의 문자에 해당하는 바이트가 무엇인지 어떻게 알 수 있습니까? 나는 hexdump -C file명령을 시도 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|하고 출력으로 얻었다 .
user13107

1
당신이 얻은 것에서, 유일한 최상위 비트 세트 바이트 (16 진수 값이 80 이상인 바이트)는 e6임을 알 수 있습니다. 이것은 유효한 UTF-8 시퀀스에 해당하지 않습니다 (UTF-8에서 비 ASCII 문자에는 최소 2 개의 최상위 비트 세트 바이트가 필요함). ISO-8859-1에서 e6은 예상되는 텍스트에 해당하는 "æ"문자의 인코딩입니다. 따라서이 파일에 ISO-8859-1 인코딩 (또는 유사한)이 사용되었음을 확인합니다.
vinc17

5

링크 한 파일이 HTML 문서에서 UTF-8 인 것으로 보입니다.

$ file 0606461.txt 
0606461.txt: HTML document, ASCII text, with CRLF line terminators

HTML- 텍스트 변환기를 통해 먼저 실행하는 경우 (예 :

iconv -f UTF-8 -t ascii//TRANSLIT < <(html2text 0606461.txt)

문제가있는 것으로 보이는 UTF-8 조각은 오류없이 음역하는 것처럼 보입니다.

Si fractus illabatur orbis.
Impavidum ferient ruinæ
--Horace.

된다

Si fractus illabatur orbis.
Impavidum ferient ruinae
--Horace.

html2text유틸리티는 시스템에 설치되지 않았을 수 있습니다. 찾을 수 없거나 설치하지 못하면 파이썬 모듈을 포함한 다른 변환기가 있습니다.


아니요, 파일은 UTF-8로 인코딩되지 않고 ISO-8859-1로 인코딩됩니다. BTW에서 file명령은 ASCII라고하지만 그 이유는 파일의 시작 부분 만보고 ISO-8859-1 문자가 181536 위치에 멀리 나타나기 때문입니다.
vinc17

@ vinc17 ISO-8859 파일을 어떻게 찾았습니까?
user13107

1
@ user13107은 문제가되는 문자의 인코딩을보고 UTF-8 시퀀스 "c3 a6"이 아니라 "e6"바이트입니다. Emacs는 또한 파일이 ISO-8859-1에있는 것으로 탐지했습니다.
vinc17
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.