具体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");
}

现在我提倡尝试让罗马图书馆来处理这个问题,但如果所有其他方法都失败了,这将是一种方法。