2

我正在从 Servlet 中的 Perl 页面读取 HTTP 响应,如下所示:

public String getHTML(String urlToRead) {
        URL url;
        HttpURLConnection conn;
        BufferedReader rd;
        String line;
        String result = "";
        try {
           url = new URL(urlToRead);
           conn = (HttpURLConnection) url.openConnection();
           conn.setRequestMethod("GET");
           conn.setRequestProperty("Accept-Charset", "UTF-8");
           conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");

           rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
           while ((line = rd.readLine()) != null) {
              byte [] b = line.getBytes();
              result += new String(b, "UTF-8");
           }
           rd.close();
        } catch (Exception e) {
           e.printStackTrace();
        }
        return result;
   }

我用这段代码显示这个结果:

response.setContentType("text/plain; charset=UTF-8");

        PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8"), true);


        try {

            String query = request.getParameter("query");
            String type = request.getParameter("type");

            String res = getHTML(url);
            out.write(res);

        } finally {            
            out.close();
        }

但是响应仍然没有编码为 UTF-8。我究竟做错了什么?

提前致谢。

4

4 回答 4

3

那个电话line.getBytes()看起来很可疑。line.getBytes("UTF-8")如果您确定返回的内容是 UTF-8 编码的,您可能应该这样做。此外,我不确定为什么它甚至是必要的。从 a 中获取数据的典型方法BufferedReader是使用 aStringBuilder继续将每个String检索readLine到的数据附加到结果中。String和之间的来回转换byte[]是不必要的。

更改result为 aStringBuilder并执行以下操作:

while ((line = rd.readLine()) != null) {
    result.append(line);
}
于 2013-04-07T22:34:41.723 回答
2

这是您打破字符编码转换链的地方:

       while ((line = rd.readLine()) != null) {
          byte [] b = line.getBytes();  // NOT UTF-8
          result += new String(b, "UTF-8");
       }

来自 String#getBytes() javadoc:

使用平台的默认字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中

而且,默认字符集可能不是 UTF-8。

但是为什么首先要进行所有转换?只需从源读取原始字节并将原始字节写入消费者。它应该一直是UTF-8。

于 2013-04-07T22:43:42.943 回答
0

我在另一种情况下也遇到了同样的问题,但只要去做,我相信它会起作用:

byte[] b = line.getBytes(UTF8_CHARSET);

在while循环中:

while ((line = rd.readLine()) != null) {
          byte [] b = line.getBytes();  // NOT UTF-8
          result += new String(b, "UTF-8");
       }
于 2015-03-04T14:26:01.283 回答
0

就我而言,我确实添加了另一个配置

以前,我是这样写页面的:

try (PrintStream printStream = new PrintStream(response.getOutputStream()) {
        printStream.print(pageInjecting);
}

我改为:

try (PrintStream printStream = new PrintStream(response.getOutputStream(), false, "UTF-8")) {
        printStream.print(pageInjecting);
}
于 2017-02-07T17:56:07.087 回答