如何使用 UTF-8 读取 InputStream?

Posted

技术标签:

【中文标题】如何使用 UTF-8 读取 InputStream?【英文标题】:How to read a InputStream with UTF-8? 【发布时间】:2012-07-21 03:11:45 【问题描述】:

欢迎大家

我正在开发一个 Java 应用程序,它从 Internet 调用一个 php,它给了我一个 XML 响应。

响应中包含这个词:“Próximo”,但是当我解析 XML 的节点并将响应获取到字符串变量中时,我收到这样的词:“Pró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"); 

【问题讨论】:

您确定这是编码问题吗?您是否使用网络浏览器测试过您的 PHP 内容?我认为源 XML 包含转义字符! 你在这里问了另一个问题:***.com/questions/11494069/…@kgb 的答案是你应该看的。这不是编码问题。似乎 xml 的内容是一些 html 数据,并且该数据被转义了。你需要取消它。以下链接向您展示了 html 如何在外语中转义一些特殊字符 thesauruslex.com/typo/eng/enghtml.htm 【参考方案1】:

当您获得 InputStream 时,请从其中读取 byte[]s。创建字符串时,请传入 CharSetfor "UTF-8"。示例:

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

注意,您可能希望将缓冲区设置为合理的大小(例如 1024),并不断调用inputStream.read(buffer)


@阿米尔帕沙扎德

是的,您也可以使用 InputStreamReader,并尝试将 parse() 行更改为:

Document doc = db.parse(new InputSource(new InputStreamReader(in, "UTF-8")));

【讨论】:

InputStreamReader 呢? 是否有不需要将整个InputStream 预先读入内存的解决方案?有时它可能会很大...... 我无法用你的解决方案修复我的代码...拜托,你能用你的解决方案编辑我的代码,以便我可以用我的 php xml 文件对其进行测试吗? @TomaszNurkiewicz 是的,您可以将其写入文件,然后将文件传递给db.parse() 正如其他人所指出的,这不是编码问题。 HTML 实体 ó正在作为提要的一部分发送,从中获取可读字符的唯一方法是翻译实体。

以上是关于如何使用 UTF-8 读取 InputStream?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不读取 InputStream 的情况下检查 InputStream 是不是为空?

调用 IOUtils.copy 后如何重新读取 InputStream?

如何以编程方式取消从 InputStream 中读取?

Java -- 如何从 inputStream (socket/socketServer) 中读取未知数量的字节?

InputStream如何读取完整数据

如何读取服务器套接字 JAVA 中的所有 Inputstream