Умлауты, возвращенные Google Weather API, не отображаются должным образом - PullRequest
1 голос
/ 06 января 2012

Я пытаюсь прочитать информацию о погоде из Google Weather API.

Мой код выглядит примерно так:

            String googleWeatherUrl = "http://www.google.de/ig/api?weather=berlin&hl=de";
    InputStream in = null;
    String xmlString = "";
    String line = "";
    URL url = null;
    try {
        url = new URL(googleWeatherUrl);
        in = url.openStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, UTF_8));
        while ((line = bufferedReader.readLine()) != null) {
            xmlString += line;
        }
    } catch (MalformedURLException e) {
    } catch (IOException e) {
    } 

    DocumentBuilder builder = null;
    Document doc = null;
    try {
        builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        InputSource source = new InputSource(new StringReader(xmlString));
        doc = builder.parse(source);

    } catch (ParserConfigurationException e) {} 
              catch (FactoryConfigurationError e) {} 
              catch (SAXException e) {} catch (IOException e) {}

В основном это работает как шарм, но когда возвращаемые данные содержат умляуты (ö, ü, ä, ...), тогда эти символы не отображаются должным образом. В Eclipse, а также в браузере или в соответствующем исходном коде они отображаются в виде прямоугольников (или чего-то похожего странного).

На самом деле уже переменная xmlString содержит поврежденные умлауты.

У кого-нибудь есть идеи по этому поводу?

Спасибо и всего наилучшего, Пол

1 Ответ

3 голосов
/ 06 января 2012

Добро пожаловать в волшебный мир кодировок символов.Пожалуйста, оставьте свой здравый смысл на стойке у двери ...

Скорее всего, вам нужно использовать source.setEncoding(encoding) и указать правильную кодировку символов для веб-страницы - если вам повезет, кодировка может быть действительно указанав заголовках.

Измените кодировку вашего входного потока на "Latin1" следующим образом:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, Charset.forName("Latin1")));

При тестировании на моем компьютере будут возвращены правильные немецкие символы:

<current_conditions><condition data="Meistens bewölkt"/>

...