在unix中处理utf 8个字符

在unix中处理utf 8个字符,unix,exception,encoding,utf-8,Unix,Exception,Encoding,Utf 8,我试图为我的问题找到一个解决方案,在看了论坛后,我无法找到,所以我将在这里解释我的问题 我们从客户机接收到一个csv文件,该文件带有一些特殊字符,编码为unknown-8bit。我们使用awk脚本将此csv文件转换为xml。对于xml文件,我们使用utf-8作为默认编码对系统进行API调用。响应是一个错误,包含以下信息: org.apache.xerces.impl.io.MalformedByteSequenceException:1字节UTF-8序列的字节1无效 文件内容如下: 151215

我试图为我的问题找到一个解决方案,在看了论坛后,我无法找到,所以我将在这里解释我的问题

我们从客户机接收到一个csv文件,该文件带有一些特殊字符,编码为unknown-8bit。我们使用awk脚本将此csv文件转换为xml。对于xml文件,我们使用utf-8作为默认编码对系统进行API调用。响应是一个错误,包含以下信息:

org.apache.xerces.impl.io.MalformedByteSequenceException:1字节UTF-8序列的字节1无效

文件内容如下:

151215901579-109617744500,桑德拉,桑德拉,科斯菲尔德,科斯菲尔德,48653,DE,1,2.30,阿斯特拉16V骑士杯涡轮蓝10,53.82,GB,,.80,3,阿斯特拉16V骑士杯涡轮蓝10MM 4芯点火高温引线MLR.CR,,sandra@online.de,parcel1,无效请求,,%004865315500320004648880276,INTL,%004865315500320004648880276,1,INTL,DPD,180380,INTL,2.30,发送A2B有限公司,地址:GBR,WC1X8XZ,伦敦格雷酒店路200号4楼

我认为问题出在字段“200 Gray’s Inn Road”中,因为当我使用utf-8编码时,它会自动将“'”字符转换为x92值

有人知道我该怎么办吗

提前感谢,


桑德拉

显然,如果不是,不要假装它是UTF-8。找出编码是什么,或者用UTF-8序列0xEF 0xBF 0xBD替换所有非ASCII字符


由于您能够很好地查看这个特定的示例,您显然已经知道它是哪种编码(即使您不知道——它将是您当前设置使用的任何编码)——我会猜测哪个使用0x92作为曲线右单引号。

首先找出实际编码,最好是询问发送者。
如果您无法执行此操作,并且对于健全性检查,则非常有用(链接页面显示更多选项)。
下一步,转换为UTF-8

由于它显然是一种基于ASCII的编码,如果这种损失是可以接受的,您可以放弃所有非ASCII编码或在编码时替换它们

或者,在您选择的编辑器中打开它,并翻转用于解释数据的编码,直到获得有用的内容。我猜你会选择Latin-1或Windows-1252,但请自己检查一下


最后一步,做你想做的事,让人欣慰的是,你现在拥有了有效的UTF-8。

Hi triplee,谢谢你的回答。因为这不是我要接收的唯一文件,所以我需要设置默认编码。我们决定使用utf-8,因为它可以覆盖更多字符。问题是,对于更多的特殊字符,我也会遇到同样的问题,所以我需要一种方法,用每个值替换所有十六进制字符。你知道怎么做吗?我不明白你想要什么,而且这似乎是另一个问题的主题。Awk的
gsub
函数可能很容易实现您想要的功能。UTF-8是一个糟糕的选择,因为它与大多数传统的8位编码不兼容。另一方面,盲目地将拉丁语-1应用于可能采用不同编码的文件也不是一个好主意。你真的应该弄清楚输入数据的编码;这是唯一合理的解决方案。@tripleee:UTF-8是为兼容8位扩展ASCII编码而设计的。尽管如此,传统编码是按定义进行的,而不是Unicode编码,使用错误的字符集总是错误的。我的意思是,许多字符串都是无效的UTF-8字符串,这是不兼容的,所以你不能假装字符集没有什么不同。我同意这是错误的。嗨,重复数据消除,谢谢你回复我的会议。我使用file命令来检测编码,我得到了未知的8bit。如果我尝试在API调用中使用这种编码,它将不起作用,因此我决定将utf-8设置为默认编码。我试图避免丢弃这些字符,所以如果我能替换它们就太好了。有什么想法吗?又增加了一个选项,归结起来就是使用内置的高级模式识别机器(又名大脑)手动完成。不是很好,但通常比放弃要好。您可以使用enca或chardet来猜测编码。