我有一个文件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
答案 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伪代码,但是使用你喜欢的任何东西)。