带有特定字符的 XMLPullParser 黑菱形问号
XMLPullParser black diamond question marks with certain characters
我正在制作一个 android 应用程序,它需要获取和解析 XML。 class 是按照此处 http://www.tutorialspoint.com/android/android_rss_reader.htm 的说明制作的,提取器方法如下所示:
public void fetchXML() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
InputStream stream = conn.getInputStream();
xmlFactoryObject = XmlPullParserFactory.newInstance();
xmlFactoryObject.setValidating(false);
xmlFactoryObject.setFeature(Xml.FEATURE_RELAXED, true);
xmlFactoryObject.setNamespaceAware(true);
XmlPullParser myparser = xmlFactoryObject.newPullParser();
//myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
myparser.setInput(new InputStreamReader(stream, "UTF-8"));
parseXMLAndStoreIt(myparser);
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
解析器看起来像教程中的那个,里面有我的解析逻辑。
从
可以看出
myparser.setInput(new InputStreamReader(stream, "UTF-8"));
我正在使用 UTF-8 字符集。现在,当我在我的解析器中使用 getText() 方法时,例如在单词 'Jõhvi' 上,logcat 输出是 'J�hvi' 。对于我的母语爱沙尼亚语中不属于英语字母表的其他字符,情况也是如此。我需要将此字符串用作键并在用户界面中使用,因此这是不可接受的。我认为这是一个字符集问题,但 XML 站点上没有任何信息,我从
中提取并使用它
conn.getContentEncoding()
returns null 所以我在黑暗中。
内容编码和字符编码不是一回事。
内容编码是指压缩,例如gzip。由于 getContentEncoding()
为空,这告诉您没有压缩。
您应该查看 conn.getContentType()
,因为字符编码通常可以在 content-type
响应中找到 header。
conn.getContentType()
可能 return 类似于:
text/xml; charset=ISO-8859-1
所以你将不得不做一些解析。在 "charset=" 之后查找字符集名称,但要为指定 mime 类型但未指定字符集的情况做好准备。
我正在制作一个 android 应用程序,它需要获取和解析 XML。 class 是按照此处 http://www.tutorialspoint.com/android/android_rss_reader.htm 的说明制作的,提取器方法如下所示:
public void fetchXML() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
InputStream stream = conn.getInputStream();
xmlFactoryObject = XmlPullParserFactory.newInstance();
xmlFactoryObject.setValidating(false);
xmlFactoryObject.setFeature(Xml.FEATURE_RELAXED, true);
xmlFactoryObject.setNamespaceAware(true);
XmlPullParser myparser = xmlFactoryObject.newPullParser();
//myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
myparser.setInput(new InputStreamReader(stream, "UTF-8"));
parseXMLAndStoreIt(myparser);
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
解析器看起来像教程中的那个,里面有我的解析逻辑。
从
可以看出 myparser.setInput(new InputStreamReader(stream, "UTF-8"));
我正在使用 UTF-8 字符集。现在,当我在我的解析器中使用 getText() 方法时,例如在单词 'Jõhvi' 上,logcat 输出是 'J�hvi' 。对于我的母语爱沙尼亚语中不属于英语字母表的其他字符,情况也是如此。我需要将此字符串用作键并在用户界面中使用,因此这是不可接受的。我认为这是一个字符集问题,但 XML 站点上没有任何信息,我从
中提取并使用它conn.getContentEncoding()
returns null 所以我在黑暗中。
内容编码和字符编码不是一回事。
内容编码是指压缩,例如gzip。由于 getContentEncoding()
为空,这告诉您没有压缩。
您应该查看 conn.getContentType()
,因为字符编码通常可以在 content-type
响应中找到 header。
conn.getContentType()
可能 return 类似于:
text/xml; charset=ISO-8859-1
所以你将不得不做一些解析。在 "charset=" 之后查找字符集名称,但要为指定 mime 类型但未指定字符集的情况做好准备。