2012-01-06 4 views
1

Я пытаюсь прочитать информацию о погоде из API Google Weather.Umlauts, возвращенный API 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 содержит поврежденные умлауты.

У кого-нибудь есть идея?

Спасибо и наилучшими пожеланиями, Пол

+0

Вы должны сказать нам, где эти символы потерялся. «XmlString» все еще содержит их? – home

+0

хороший звонок. Я отредактировал вопрос. xmlString уже поврежден ... – Paul

+0

Ответ от сервера в ISO-8859-1 (отличная работа, Google), а не UTF-8. Вот почему это было неправильно. Я думаю, вам не нужно устанавливать кодировку вручную, это, вероятно, будет ОК из коробки. Если это не так, у вас нет выбора, кроме как использовать [HttpURLConnection] (http://docs.oracle.com/javase/1.4.2/docs/api/java/net/HttpURLConnection.html) получить заголовок Content-Type, проанализируйте кодировку, а затем установите ее соответствующим образом. Я просто надеюсь, что ребята из Sun действительно подумали об этом. –

ответ

3

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

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

Изменить кодировку вашего InputStream на "latin1", как так:

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

Это возвращает правильные немецкие символы при испытании на моей машине:

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