Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 特定XML数据被篡改_Java_Xml_Character Encoding_Rss - Fatal编程技术网

Java 特定XML数据被篡改

Java 特定XML数据被篡改,java,xml,character-encoding,rss,Java,Xml,Character Encoding,Rss,我正在使用kat.cr的RSS源进行个人项目。我试图使用罗马框架阅读提要,但遇到了一个重大问题 我尝试使用Rome的所有其他提要(以及其他更基本的读取提要的方式)都工作得很好,但是,下面的提要继续抛出与字符编码相关的异常 然后,我创建了以下方法来查看接收到的数据的外观: public static void saveXML(String url) throws IOException { Client client = ClientBuilder.newClient(); Re

我正在使用kat.cr的RSS源进行个人项目。我试图使用罗马框架阅读提要,但遇到了一个重大问题

我尝试使用Rome的所有其他提要(以及其他更基本的读取提要的方式)都工作得很好,但是,下面的提要继续抛出与字符编码相关的异常

然后,我创建了以下方法来查看接收到的数据的外观:

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格式压缩的

现在我打算写一个更好的答案来解决你的问题,但是你的方法会产生一个
字符串
,在这一点上,你可能已经改变了服务器的原始字节,导致转换无法工作。我对罗马框架一无所知,也不知道如何让它返回字节或为您解压。但假设您有一些压缩的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文件签名。我在这个网站上查找文件签名,但是你可以在很多地方查找。假设您有响应中的字节,您可以执行以下操作:

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

现在我主张让罗马图书馆来处理这个问题,但如果其他方法都失败了,这将是解决问题的一种方法。

正是这样。非常感谢你的帮助。如果你不介意我问的话,你是如何确定它是用gzip压缩的?您是否使用您在回答中提供的字节序列识别了它?@fakeskuH我在浏览器中找到了URL,它工作正常,因此我认为您的代码(或罗马库)中的某些内容处理不正确。查看该网站的HTTP头,我看到它的头是
“content encoding:gzip”
。我只是在一个测试请求/响应周围抛出了一个
GZIPInputStream
,它成功了!我知道我错过了什么。再次感谢!