1

GoogleWeatherWebサービスから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 の場合、通常は InputStream を直接 xml パーサーに渡して、エンコーディングを自動的に検出させる必要があります。それ以外の場合は、コンテンツ タイプの応答ヘッダーの charset パラメータを調べて、正しいエンコーディングを判断し、適切な InputStreamReader を作成する必要があります。

編集:おそらくAccept-Charsetリクエストヘッダーに応じて、そのサーバーは実際にブラウザとJavaクライアントに異なるエンコーディングで応答しています。Firefox の場合、このヘッダーには値があります

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

これは、両方の文字セットが受け入れられることを意味し、どちらかを優先する必要はありません。Content-Typeサーバーは のヘッダーで応答しますtext/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 に答える
1

あなたの入力は正しいかもしれませんが、XML パーサーを使用して XML を読み取り、これを行ごとのフィードとして解釈しようとするのではありません。ただし、出力が正しくない可能性があります。

  1. JVM のデフォルトの char エンコーディングは何ですか? 紛らわしい名前のプロパティを確認 (および設定) します -Dfile.encoding=UTF-8
  2. 必要なフォントなどがシステムに存在しますか? 端末の設定に依存せずに、出力している実際の文字コードを確認できますか? エンコード/デコードが機能しているように見え、個々の文字が欠落しているだけなので、これがおそらく当てはまると思います。
于 2012-05-23T16:01:19.403 に答える