Ответ 1
Вы можете использовать конструктор String с параметром charset:
try
{
final String s = new String(nodevalue.getBytes(), "UTF-8");
}
catch (UnsupportedEncodingException e)
{
Log.e("utf8", "conversion", e);
}
Кроме того, поскольку вы получаете данные из XML-документа, и я предполагаю, что он кодируется UTF-8, вероятно, проблема заключается в его разборе.
Вы должны использовать InputStream
/InputSource
вместо реализации XMLReader
, потому что он поставляется с кодировкой. Поэтому, если вы получаете данные из ответа HTTP, вы можете использовать как InputStream
, так и InputSource
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());