1

我正在尝试从 Google 天气网络服务读取 XML 数据。响应包含一些西班牙语字符。问题是这些字符没有正确显示。我试图将所有内容都转换为 UTF-8,但这似乎没有帮助。代码如下

public static void main(String[] args) {
    try {
    URL url = new URL("http://www.google.com/ig/api?weather=Noja&hl=es");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();

    BufferedReader in = new BufferedReader(new InputStreamReader(
    con.getInputStream(), "UTF-8"));
    String str = in.readLine();
    //this does not work even                        
    //String str = new String(in.readLine().getBytes("UTF-8"),"UTF-8");
    System.out.println(str);

    in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}

输出如下(修剪以使帖子保持在限制范围内)。注意“mi�”和s�b

修剪以保持最大字符限制

<day_of_week data="mi�"/><day_of_week data="s�b"/><low data="11"/><high data="16"/><icon data="/ig/images/weather/chance_of_rain.gif"/><condition data="Posibilidad de lluvia"/></forecast_conditions></weather></xml_api_reply>
4

2 回答 2

1

您的输入可能是正确的,尽管我会使用 XML 解析器来读取 XML,而不是尝试将其解释为逐行提要。但是,您的输出可能不正确。

  1. JVM 的默认字符编码是什么?检查(并设置)混淆命名的属性 -Dfile.encoding=UTF-8
  2. 您的系统上是否存在必需的字体等?你能检查你输出的实际字符代码而不依赖你的终端设置吗?我怀疑可能是这种情况,因为编码/解码似乎有效,而您只是缺少那些单独的字符。
于 2012-05-23T16:01:19.403 回答
1

如果该页面是 xml,那么您通常应该将 InputStream 直接传递给 xml 解析器并让它自动检测编码。否则,您应该查看内容类型响应标头的 charset 参数以确定正确的编码并创建适当的 InputStreamReader。

编辑:该服务器确实以不同的编码响应浏览器和 java 客户端,可能取决于Accept-Charset请求标头。对于 Firefox,此标头具有值

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n

这意味着两个字符集都被接受,没有一个偏好。服务器Content-Typetext/xml; charset=UTF-8. java 客户端不发送此标头,服务器以text/xml; charset=ISO-8859-1.

要使用服务器提供的字符集,您可以使用如下代码:

Matcher matcher = Pattern.compile("charset\\s*=\\s*([^ ;]+)").matcher(contentType);
String charset = "utf-8"; // default
if (matcher.find()) {
    charset = matcher.group(1);
}
System.out.println(con.getContentType());

BufferedReader in = new BufferedReader(new InputStreamReader(
    con.getInputStream(), charset));

编辑2:原来服务器根据用户代理标头决定要使用的字符集。如果添加以下行,它将以 utf-8 字符集响应。

con.setRequestProperty("User-Agent", "Mozilla/5.0");

无论如何,Content-Type响应标头包含要使用的正确字符集。

于 2012-05-23T16:13:28.887 回答