具体XML数据乱码
Specific XML data garbled
我将 kat.cr 中的 RSS 提要用于个人项目。我尝试使用 Rome 框架阅读提要,但 运行 遇到了一个严重的问题。
我尝试使用 Rome(以及其他更基本的阅读提要的方式)的所有其他提要都运行良好,但是,以下提要继续抛出与字符编码相关的异常。
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
并且此时你可能已经改变了服务器的原始字节导致转换不起作用。我对 Rome 框架一无所知,也不知道如何使它成为 return 字节或为您解压缩它。但是假设你确实有一些压缩的 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());
但是我还是不知道 Rome 框架是如何做的。
编辑:
您还可以查找 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");
}
现在我提倡尝试让罗马图书馆来处理这个问题,但如果所有其他方法都失败了,这将是一种方法。
我将 kat.cr 中的 RSS 提要用于个人项目。我尝试使用 Rome 框架阅读提要,但 运行 遇到了一个严重的问题。
我尝试使用 Rome(以及其他更基本的阅读提要的方式)的所有其他提要都运行良好,但是,以下提要继续抛出与字符编码相关的异常。
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
并且此时你可能已经改变了服务器的原始字节导致转换不起作用。我对 Rome 框架一无所知,也不知道如何使它成为 return 字节或为您解压缩它。但是假设你确实有一些压缩的 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());
但是我还是不知道 Rome 框架是如何做的。
编辑:
您还可以查找 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");
}
现在我提倡尝试让罗马图书馆来处理这个问题,但如果所有其他方法都失败了,这将是一种方法。