如何使用 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。创建字符串时,请传入 CharSet
for "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?