2012-02-05 22 views
0

我有一个Java Servlet,它获取RSS提要将它们转换为JSON。它在Windows上很好用,但在Centos上失败。将XML转换为JSON导致在Centos而不是Windows上运行时出现未知字符

RSS提要包含阿拉伯语,它在Centos上显示难以理解的字符。我正在使用这些行来编码RSS提要:

byte[] utf8Bytes = Xml.getBytes("Cp1256"); 
// byte[] defaultBytes = Xml.getBytes(); 

String roundTrip = new String(utf8Bytes, "UTF-8"); 

我在Glassfish和Tomcat上试了一下。两者都有同样的问题。它适用于Windows,但在Centos上失败。这是如何造成的,我该如何解决这个问题?

+1

'byte [] utf8Bytes = Xml.getBytes(“Cp1256” );' - 这没有道理...... – skaffman 2012-02-05 11:40:48

回答

5
byte[] utf8Bytes = Xml.getBytes("Cp1256"); 
String roundTrip = new String(utf8Bytes, "UTF-8"); 

这是纠正严重解码串的尝试。在此操作之前的某个时间点,您已使用默认编码在Xml中读取,该编码在Windows盒子上是代码页1256(Windows阿拉伯语)。在这里,您将该字符串编码回代码页1256以检索其原始字节,然后将其正确解码为您实际需要的编码UTF-8。

在您的Linux服务器上,它会失败,因为默认编码不是Cp1256;它也会在任何未安装在阿拉伯语语言环境中的Windows服务器上失败。

使用默认编码而不是显式地Cp1256的注释行更有可能在Linux服务器上工作。但是,真正的解决方法是找到正在读取的地方,并修复该操作以使用正确的编码(*)而不是默认值。允许使用默认编码几乎总是一个错误,因为它使得应用程序依赖于服务器之间不同的配置。找出正确的编码为饲料取决于Content-Type标题返回资源和<?xml encoding(*:对于此饲料,这是UTF-8,这是最常见的编码,但它可能会有所不同。到目前为止,解决这个问题的最好方法是使用一个知道这个的适当XML库来获取和分析资源,例如DocumentBuilder.parse(uri)。)

相关问题