2016-05-15 44 views
2

我正在使用来自kat.cr的RSS提要作为个人项目。我试图使用罗马框架阅读feed,并遇到了一个重大问题。特定的XML数据出现乱码

我尝试使用罗马(以及其他更基本的阅读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编码字节序列。

我彻底失去了,任何帮助将非常感激。

回答

0

您收到的内容使用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"); 
} 

现在我会主张试图让罗马库不照顾,但如果一切都失败了,这将是其中一个办法它。

+0

就是这样。非常感谢您的帮助。如果你不介意我问,你是怎么确定它是用gzip压缩的?你是否使用你在答案中提供的字节序列来识别它? –

+0

@fakeskuH嗯,我去了我的浏览器的网址,它工作的很好,所以这让我觉得它是在你的代码(或罗马图书馆),它没有正确处理它的东西。看看那个网站的HTTP头文件,我看到它有头文件'“content-encoding:gzip”'。我只是在测试请求/响应周围扔了一个'GZIPInputStream',它工作正常! –

+0

我知道我错过了什么。再次感谢! –