2011-04-29 65 views
11

我有一个字符串,它通过一个XML来,它是德文文本。德国特定的字符是通过UTF-8格式编码的。在显示字符串之前,我需要解码它。解码字符串编码utf-8格式在android

我曾尝试以下:

try { 
    BufferedReader in = new BufferedReader(
      new InputStreamReader(
        new ByteArrayInputStream(nodevalue.getBytes()), "UTF8")); 
    event.attributes.put("title", in.readLine()); 
} catch (UnsupportedEncodingException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

我也试过这样:

try { 
    event.attributes.put("title", URLDecoder.decode(nodevalue, "UTF-8")); 
} catch (UnsupportedEncodingException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

他们都不是工作。如何解码德文字符串

谢谢您提前。

UDPDATE:

@Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 
    // TODO Auto-generated method stub 
    super.characters(ch, start, length); 
    if (nodename != null) { 
     String nodevalue = String.copyValueOf(ch, 0, length); 
     if (nodename.equals("startdat")) { 
      if (event.attributes.get("eventid").equals("187")) { 
      } 
     } 
     if (nodename.equals("startscreen")) { 
      imageaddress = nodevalue; 
     } 
     else { 
      if (nodename.equals("title")) { 
       // try { 
       // BufferedReader in = new BufferedReader(
       // new InputStreamReader(
       // new ByteArrayInputStream(nodevalue.getBytes()), "UTF8")); 
       // event.attributes.put("title", in.readLine()); 
       // } catch (UnsupportedEncodingException e) { 
       // // TODO Auto-generated catch block 
       // e.printStackTrace(); 
       // } catch (IOException e) { 
       // // TODO Auto-generated catch block 
       // e.printStackTrace(); 
       // } 
       // try { 
       // event.attributes.put("title", 
       // URLDecoder.decode(nodevalue, "UTF-8")); 
       // } catch (UnsupportedEncodingException e) { 
       // // TODO Auto-generated catch block 
       // e.printStackTrace(); 
       // } 
       event.attributes.put("title", StringEscapeUtils 
         .unescapeHtml(new String(ch, start, length).trim())); 
      } else 
       event.attributes.put(nodename, nodevalue); 
     } 
    } 
} 
+0

我无法在需要时找到此问题解答。因此,我现在已经复制了它,我希望这将快速弹出下一次 – Jayy 2013-04-30 13:51:27

回答

20

你可以使用String构造与charset参数:

​​

而且,因为你从XML文档获取数据,我认为它是编码的UTF-8,可能是解析它的问题。

您应该使用InputStream/InputSource而不是XMLReader实现,因为它带有编码。所以,如果你是从一个HTTP响应得到这个数据,您既可以同时使用InputStreamInputSource

try 
{ 
    HttpEntity entity = response.getEntity(); 
    final InputStream in = entity.getContent(); 
    final SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 
    final XmlHandler handler = new XmlHandler(); 
    Reader reader = new InputStreamReader(in, "UTF-8"); 
    InputSource is = new InputSource(reader); 
    is.setEncoding("UTF-8"); 
    parser.parse(is, handler); 
    //TODO: get the data from your handler 
} 
catch (final Exception e) 
{ 
    Log.e("ParseError", "Error parsing xml", e); 
} 

或只是InputStream

try 
{ 
    HttpEntity entity = response.getEntity(); 
    final InputStream in = entity.getContent(); 
    final SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 
    final XmlHandler handler = new XmlHandler(); 
    parser.parse(in, handler); 
    //TODO: get the data from your handler 
} 
catch (final Exception e) 
{ 
    Log.e("ParseError", "Error parsing xml", e); 
} 

更新1

这里一个完整的请求和响应处理示例:

try 
{ 
    final DefaultHttpClient client = new DefaultHttpClient(); 
    final HttpPost httppost = new HttpPost("http://example.location.com/myxml"); 
    final HttpResponse response = client.execute(httppost); 
    final HttpEntity entity = response.getEntity(); 

    final InputStream in = entity.getContent(); 
    final SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 
    final XmlHandler handler = new XmlHandler(); 
    parser.parse(in, handler); 
    //TODO: get the data from your handler 
} 
catch (final Exception e) 
{ 
    Log.e("ParseError", "Error parsing xml", e); 
} 

更新2

由于问题不是编码,但源XML被转义为HTML实体,最好的办法是(除了修正PHP做不逃避响应),使用apache.commons.lang library“非常方便static StringEscapeUtils class

导入库,在你的XML处理程序的characters方法后你把以下内容:

@Override 
public void characters(final char[] ch, final int start, final int length) 
    throws SAXException 
{ 
    // This variable will hold the correct unescaped value 
    final String elementValue = StringEscapeUtils. 
     unescapeHtml(new String(ch, start, length).trim()); 
    [...] 
} 

更新3

在您的最后一个码的问题是与nodevalue变量的初始化。它应该是:

String nodevalue = StringEscapeUtils.unescapeHtml(
    new String(ch, start, length).trim()); 
+0

我在哪里通过URL在这里? – user590849 2011-04-29 09:10:38

+0

你的意思是从哪里获得XML数据响应的网址? – rekaszeru 2011-04-29 09:20:17

+0

是的。你使用的响应对象是什么。它是HttpResponse对象吗? – user590849 2011-04-29 09:21:55