iconv不正な入力シーケンス-なぜですか?


13

テキストファイルをASCIIに変換しようとすると、エラーメッセージが表示されiconv: illegal input sequence at positionます。

私が使用するコマンドは iconv -f UTF-8 -t ascii//TRANSLIT file

問題の文字はæです。

テキストファイル自体はここにあります

なぜ違法なシーケンスと言うのですか?入力文字は適切なUTF-8文字(U + 00E6)です。

回答:


16

ファイルは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 14

1
あなたが得たものでは、唯一のトップビットセットバイト(16進法で80以上の値を持つバイト)がe6であることがわかります。これは有効なUTF-8シーケンスに対応していません(UTF-8では、非ASCII文字には少なくとも2ビットの最上位ビットが必要です)。ISO-8859-1では、e6は文字「æ」のエンコードであり、予想されるテキストに対応しています。したがって、これにより、このファイルにISO-8859-1エンコード(または類似の)が使用されていることが確認されます。
vinc17 14

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 14
15:19に

@ vinc17ファイルがISO-8859にあることをどのようにして見つけましたか?
user13107 14

1
@ user13107は、問題の文字のエンコードを確認します。これは、バイト「e6」であり、UTF-8シーケンス「c3 a6」ではありません。Emacsは、ファイルがISO-8859-1にあることも検出しました。
vinc17 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.