特定的XML数据出现乱码
我正在使用来自kat.cr的RSS提要进行个人项目。 我试图使用罗马框架阅读feed,并遇到了一个重大问题。
我尝试使用罗马的所有其他Feed(以及其他更基本的阅读Feed的方式)都很好,但是,下面的Feed保留了与字符编码相关的例外情况。
https://kat.cr/usearch/Arrow%20S04E21/?field=seeders&sorder=desc&rss=1
然后我创建了以下方法来查看接收到的数据的样子:
public static void saveXML(String url) throws IOException {
Client client = ClientBuilder.newClient();
Response r = client.target(url).request(MediaType.TEXT_PLAIN_TYPE).get();
PrintWriter out = new PrintWriter("XML.txt");
String sXML = r.readEntity(String.class);
out.print(sXML);
out.close();
}
上述提要导致数据出现乱码,而所有其他提要完美显示。 为什么即使字符集被强制转换为UTF-8,它在任何浏览器中都能很好地显示出来?
我查看了Hexplorer中的'XML.txt'文件,并注意到整个文件中的UTF-8编码字节序列。
我彻底失去了,任何帮助将非常感激。
您收到的内容使用GZip格式进行压缩。
现在我打算用一种解决问题的方法写出更好的答案,但是您的方法会产生一个String
,并且此时您可能已经更改了服务器中的原始字节,导致转换无法工作。 我对罗马框架一无所知,或者如何让它返回字节或为你解压。 但假设你有一些压缩的gzip字节,你可以这样做:
public static String decompress(byte [] data) throws IOException {
try (
GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(data));
ByteArrayOutputStream out = new ByteArrayOutputStream();
) {
int read;
byte [] buff = new byte[1024];
while((read = gis.read(buff)) != -1) {
out.write(buff, 0, read);
}
return out.toString("UTF-8");
}
}
你可以试试这个
String sXML = r.readEntity(String.class);
return decompress(sXML.getBytes());
不过,如果它有效,我会感到惊讶。 也许你可以做
String sXML = r.readEntity(byte[].class);
return decompress(sXML.getBytes());
但我不知道罗马框架是如何做的。
编辑:
您也可以查找GZIP文件签名。 我从这个网站查看文件签名 - http://www.garykessler.net/library/file_sigs.html,但是你可以在很多地方查看它。 假设你有来自响应的字节,你可以这样做:
String sXML = r.readEntity(byte[].class);
// check for gzip encoding using signature
if(sXML.length > 3 &&
sXML[0] == (byte)0x1F &&
sXML[1] == (byte)0x8B &&
sXML[2] == (byte)0x08) {
// Is gzip encoded, decode it.
return new String(decompress(sXML), "UTF-8");
} else {
return new String(sXML, "UTF-8");
}
现在我主张努力让罗马图书馆确实照顾到这一点,但如果一切都失败了,这将是一个办法。
链接地址: http://www.djcxy.com/p/60791.html