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

29

我的系统是SUSE Linux Enterprise Server 11。

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

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

你能帮我处理这个问题吗?谢谢。


看起来从utf-8转换为iso的iconv在处理某些特定的Unicode字符时无法正常工作。 我已经使用了选项--unicode-subst=formatstring,它可以运行,虽然不是完美的解决方案,但仍然可以达到满意的效果。 - Łukasz Bensz
什么版本的iconv支持"--unicode-subst"选项? - AdamC
iconv --version iconv(GNU libc)2.12 版权所有(C)2010年自由软件基金会。 这是免费软件;请查看源代码以了解复制条件。没有保证;甚至不保证适用于特定目的。 Ulrich Drepper编写。 - Łukasz Bensz
3个回答

25

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

iconv -c -futf8 -tl1 test.utf8 > test.iso

2
是的,这个解决方案也可以正常工作,但我需要保持确切的行长度,因此我需要放置那些虚拟字符。 - Łukasz Bensz

14
有时最好同时使用-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

4

使用//TRANSLIT参数,虚拟字符将被添加。

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


它在Alpine Linux中无法工作,因为它使用了更轻量级的iconv实现。 - Sebastian Piskorski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接