2010-10-29 50 views
1

根据过去使用的语言,我已经经历了相同字符串的不同JSON编码值。由于API是在封闭环境中使用的(不允许第三方使用),我们做出了妥协,所有的Java应用程序都是手动编码Unicode字符。 LinkedIn的API正在返回“损坏”的值,这与我们的Java应用程序基本相同。我已经在他们的论坛上发布了question,我在这里问的原因很简单;共享是关怀:)因此,这个问题与LinkedIn有部分关联,但主要是试图找到下面描述的一般编码问题的答案。用PHP解码Java的JSON Unicode值

正如你所看到的,我的姓氏包含一个字母ž,应该是\u017e,但是Java(或LinkedIn的API)用JSON返回\u009e,没有XML响应。 PHP的json_decode()忽略它,我的姓氏变成Kurida。

经过调查,我发现ž显然有两个表示,9e17e。这里到底发生了什么?有没有解决这个问题的方法?

回答

0

U + 009E是一个通常不可见的控制字符,而不是ž的可接受替代表示。

字节 0x9E表示Windows代码页1252中的字符ž。如果使用ISO-8859-1解码,该字节将变成U + 009E。如果你在一个HTML页面中写入ž,浏览器实际上并没有给你字符U + 009E,正如你所期望的那样,但是将它转换为U + 017E。同样的事实也是如此。对于所有字符引用0080-009F都是如此:它们被改变,就好像数字引用了cp1252字节而不是Unicode字符一样,这​​是非常奇怪和错误的行为,但是所有主流浏览器都这样做,所以我们现在仍然坚持使用它。除了正确的XHTML作为XML,因为它必须遵循更合理的XML规则。)

看看论坛页面,JSON阅读显然没有错:您的名字被注册为“David Kurid [U + 009E]一个”。然而,这些数据已经进入了他们的系统需求中。

+1

谢谢你提供一个非常具有描述性的答案。 LinkedIn回复说,他们的API中存在一个错误,根据您的答案,我们在Java应用中也可能有类似的错误。我可以发誓我们在各地都使用UTF-8。那么,仔细检查它是:)再次感谢。 – 2010-10-31 07:54:47