#android #encoding #xml-parsing #saxparser #apache-stringutils
#Android #кодирование #xml-синтаксический анализ #saxparser #apache-stringutils
Вопрос:
У меня есть строка, которая поступает через xml, и это текст на немецком языке. Символы, специфичные для немецкого языка, кодируются в формате UTF-8. Перед отображением строки мне нужно ее декодировать.
Я попробовал следующее:
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);
}
}
}
Комментарии:
1. Я не смог найти этот вопрос и ответ, когда мне это было нужно. Следовательно, я перезаписал ее сейчас, я надеюсь, что это быстро появится в следующий раз
Ответ №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 очень удобна 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());
Комментарии:
1. куда мне передать URL-адрес здесь?
2. вы имеете в виду URL, откуда вы получаете ответ на xml-данные?
3. да. также какой объект ответа вы использовали. является ли это объектом HttpResponse?
4. пожалуйста, проверьте мое обновление для полного метода запроса. Я использовал там HttpPost, поэтому, если вам нужно установить объект с параметрами namevaluepair, вы также можете закодировать их в «UTF-8».
5. поскольку проблема заключалась не в декодировании, вы могли бы заставить ее работать, только используя apache commons
StringEscapeUtils
, как в моем примере выше. Вы должны попробовать это с помощью XmlReader StringEscapeUtils.