【问题标题】:XMLPullParser black diamond question marks with certain charactersXMLPullParser 带有某些字符的黑色菱形问号
【发布时间】:2015-07-23 18:02:37
【问题描述】:

我正在制作一个需要获取和解析 XML 的 Android 应用程序。该类是按照此处http://www.tutorialspoint.com/android/android_rss_reader.htm 的说明创建的,而 fetcher 方法如下所示:

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()

返回 null 所以我在这里一无所知。

【问题讨论】:

    标签: android xml character-encoding xmlpullparser


    【解决方案1】:

    内容编码和字符编码不是一回事。

    内容编码是指压缩,如gzip。由于getContentEncoding() 为空,这表明没有压缩。

    您应该查看conn.getContentType(),因为字符编码通常可以在content-type 响应标头中找到。

    conn.getContentType() 可能会返回如下内容:

    text/xml; charset=ISO-8859-1

    所以你必须做一些解析。在“charset=”之后查找字符集名称,但要为指定了 mime 类型但未指定字符集的情况做好准备。

    【讨论】:

    • 谢谢!虽然conn.getContentType() 只返回text/xml,但我使用了您建议的编码并且它有效。我也用谷歌搜索了一下,发现 ISO-8859-4 是“官方爱沙尼亚语”编码,它也有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多