如何使用UTF-8读取InputStream?

8
欢迎大家!
我正在开发一个Java应用程序,它从互联网调用一个PHP,该PHP给我一个XML响应。
在响应中包含这个词:“Próximo”,但是当我解析XML节点并将响应获取到一个字符串变量中时,我收到的单词是这样的:“Pr& oacute;ximo”。
我确定问题是我在Java应用程序中使用了不同的编码,然后使用了PHP脚本的编码。因此,我认为我必须将编码设置为与您的PHP xml相同,即UTF-8。
这是我用来从PHP获取XML文件的代码。 在这段代码中,我应该改变什么以将编码设置为UTF-8?(请注意,我没有使用缓冲读取器,而是使用输入流)
        InputStream in = null;
        String url = "http://www.myurl.com"
        try {                              
            URL formattedUrl = new URL(url); 
            URLConnection connection = formattedUrl.openConnection();   
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            httpConnection.setAllowUserInteraction(false);
            httpConnection.setInstanceFollowRedirects(true);
            httpConnection.setRequestMethod("GET");
            httpConnection.connect();               
            if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK)
                in = httpConnection.getInputStream();   

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();                     
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(in);
            doc.getDocumentElement().normalize();             
            NodeList myNodes = doc.getElementsByTagName("myNode"); 

1
你确定这是一个编码问题吗?你是否用浏览器测试过你的PHP内容?我认为源XML包含了转义字符! - Amir Pashazadeh
1
你在这里提出了另一个问题:http://stackoverflow.com/questions/11494069/problems-parsing-spanish-characters-a-e-i-o-u-from-xml-response那里@kgb的答案是你应该看的。这不是编码问题。似乎xml的内容是一些html数据,并且该数据已被转义。你需要取消转义。以下链接显示了html如何转义外语中的某些特殊字符http://www.thesauruslex.com/typo/eng/enghtml.htm - user890904
1个回答

9

当您获取InputStream时,从中读取byte[]。在创建字符串时,请传递“UTF-8”的CharSet。例如:

byte[] buffer = new byte[contentLength];
int bytesRead = inputStream.read(buffer);
String page = new String(buffer, 0, bytesRead, "UTF-8");

请注意,您可能需要使缓冲区大小合理化(例如1024),并不断调用inputStream.read(buffer)
@Amir Pashazadeh
是的,您还可以使用InputStreamReader,并尝试将parse()行更改为:
Document doc = db.parse(new InputSource(new InputStreamReader(in, "UTF-8")));

InputStreamReader怎么样? - Amir Pashazadeh
有没有一种解决方案,不需要预先将整个“InputStream”读入内存中?有时它可能非常大... - Tomasz Nurkiewicz
我无法使用您的解决方案修复我的代码...请问,您能否使用您的解决方案编辑我的代码,以便我可以用我的PHP XML文件进行测试? - Pableras84
@TomaszNurkiewicz 是的,你可以将它写入文件,然后将文件传递给 db.parse() - Jon Lin
正如其他人所指出的,这不是编码问题。HTML实体ó作为Feed的一部分被发送,并且从中获取可读字符的唯一方法是将实体进行转换。 - Bobulous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接