如何在unix中转换'¿'特殊字符

时间:2014-11-13 12:44:07

标签: file encoding utf-8 character-encoding unicode-string

我有一个文件file.dat,其中包含CNBC: America¿s Gun: The Rise of the AR–15

不幸的是,我得到了一些特殊字符,这些字符在unix中的iconv函数中正确转换。

$ file -bi file.dat

text/plain; charset=utf-8

$ cat file.dat | cut -c14 | od -x

0000000 bfc2 000a

0000003

你能帮助我转换特殊角色吗?

提前致谢

-Praveen

1 个答案:

答案 0 :(得分:0)

您的文件基本上没问题,它是正确的UTF-8,您正在查看的字符是INVERTED QUESTION MARK (U+00BF)(尽管您似乎使用了一些传统的8位字符集来查看文件,而且od -x的输出是面向字的little-endian,所以你得到了十六进制 - 序列是0xC2 0xBF,而不是相反。)

This article解释说,当Oracle尝试导出到未知字符集时,它将替换无法使用颠倒问号转换的字符。所以我想这就是这里发生的事情。唯一正确的解决方法是返回到您的Oracle数据库并以适当的格式导出,其中可以表示撇号(我想这个角色应该是这样)。

如果文件来自其他人的Oracle数据库,请让他们再次进行导出,或者询问他们应该是什么字符,或者忽略问题,或者猜测要放置哪个字符,然后使用编辑器。如果只有几个问题字符,请手动执行。如果有很多,也许您可​​以使用上下文相关的替换规则,如

it¿s => it’s
dog¿s => dog’s
¿problem¿ => ‘‘problem’’
na¿ve => naïve
¿yri¿ispy¿rykk¿ => äyriäispyörykkä (obviously!)

使用¿作为“我不知道”的占位符是有问题的,但Unicode实际上有一个解决方案:REPLACEMENT CHARACTER (U+FFFD)。我想你不会喜欢这个,但是你可以以编程方式执行的唯一有效(无上下文)替换是s/\u{00BF}/\u{FFFD}/g(这是Perl-ish伪代码,但是使用你喜欢的任何东西)。