为什么iconv无法从utf-8转换为iso-8859-1

Łuk*_*nsz 16 linux iso suse utf-8 iconv

我的系统是SUSE Linux Enterprise Server 11.

我正在尝试将数据从utf-8格式转换为iso使用"iconv"

$>file test.utf8
test.utf8: UTF-8 Unicode text, with very long lines
$>
$>file -i test.utf8
test.utf8: text/plain charset=utf-8
$>
$>iconv -f UTF-8 -t ISO-8859-1 test.utf8 > test.iso

iconv: test.utf8:20:105: cannot convert
Run Code Online (Sandbox Code Playgroud)

你能帮我解释一下吗?谢谢.

cho*_*oba 20

您的输入文件包含Latin 1中不存在的字符.您可以使用该-c选项跳过它们:

iconv -c -futf8 -tl1 test.utf8 > test.iso
Run Code Online (Sandbox Code Playgroud)

  • 是的,这个解决方案也很好用,但我需要保持精确的行长,所以我需要放那个虚拟字符。 (2认同)

Seb*_*ski 5

使用//TRANSLIT参数,将放置虚拟字符。

iconv -f UTF-8 -t ISO-8859-1//TRANSLIT test.utf8 > test.iso


pea*_*eak 5

有时最好同时使用-c和// TRANSLIT,例如

$ cat rodriguez
Rodr??guez

$ file rodriguez
rodriguez: UTF-8 Unicode text

$ iconv  --unicode-subst="<U+%04X>" -f UTF-8 -t ISO-8859-1 rodriguez
Rodr<U+0131><U+0301>guez

$ iconv -f UTF-8 -t ISO-8859-1 rodriguez
Rodr
iconv: rodriguez:1:4: cannot convert

$ iconv -f UTF-8 -t ISO-8859-1//TRANSLIT rodriguez
Rodri
iconv: rodriguez:1:5: cannot convert

$ iconv -c -f UTF-8 -t ISO-8859-1 rodriguez
Rodrguez

$ iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT rodriguez
Rodriguez
Run Code Online (Sandbox Code Playgroud)