Вы можете использовать конструктор 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 очень удобно static StringEscapeUtils class
.
После импорта библиотеки в методе characters
вашего обработчика xml вы добавили следующее:
@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());