带有特定字符的 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 类型但未指定字符集的情况做好准备。