iconv非法输入序列-为什么?


14

尝试将文本文件转换为等效的ASCII文件时,出现错误消息that iconv: illegal input sequence at position

我使用的命令是 iconv -f UTF-8 -t ascii//TRANSLIT file

令人反感的角色是æ

文本文件本身位于此处

为什么说非法顺序?输入的字符是正确的UTF-8字符(U + 00E6)。

Answers:


17

该文件以ISO-8859-1编码,而不是以UTF-8编码:

$ 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 2014年

1
在得到的结果中,您可以看到唯一的最高位字节(一个十六进制值≥80的字节)是e6。这与有效的UTF-8序列不对应(在UTF-8中,非ASCII字符至少需要2个高位字节)。在ISO-8859-1中,e6是字符“æ”的编码,它对应于预期的文本;因此,这确认此文件使用了ISO-8859-1编码(或类似编码)。
vinc17 2014年

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实用程序可能未安装在您的系统上-如果找不到/安装该实用程序,则还有其他转换器,包括python模块。


不,该文件不是使用UTF-8编码的,而是使用ISO-8859-1编码的。顺便说一句,该file命令的意思是ASCII,但原因是,它只是看起来在文件的开头和ISO-8859-1字符出现远,位置181536.
vinc17

@ vinc17您如何找到该文件在ISO-8859中?
user13107 2014年

1
通过查看有问题的字符的编码@ user13107:它是字节“ e6”,而不是UTF-8序列“ c3 a6”。Emacs还检测到该文件位于ISO-8859-1中。
vinc17 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.