如何在Android中正确保存和解析XML UTF-8(Ü,Ä,Ö)?

时间:2017-06-23 09:29:27

标签: java android xml utf-8 xml-parsing

1。基于

我的代码基于此教程: https://www.youtube.com/watch?v=40mYDQkK44A https://github.com/FoamyGuy/StackSites

因此,如果您正在尝试了解正在发生的事情,那么只需查看整个代码,我的内容并未发生太大变化。

2。我的XML

    <event>
    <name>Reunion</name>
    <date>Freitag 07.07.2017 </date>
    <link>EVENT LINK</link>
    <about>Über eine Woche ist es her, seit .... ÄÜÖ :-) </about>
    <image>IMAGE LINK</image>
</event>

第3。下载XML

URLConnection ucon = url.openConnection();
    /************************************************
     * Define InputStreams to read from the URLConnection.
     ************************************************/
    InputStream is = ucon.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(is);
     /************************************************
     * Define OutputStreams to write to our file.
     ************************************************/

    BufferedOutputStream bos = new BufferedOutputStream(fos);
    byte data[] = new byte[1024];
    //long total = 0;
    int count;
    //loop and read the current chunk

    while ((count = bis.read(data)) != -1) {
        //keep track of size for progress.
        //total += count;

        //write this chunk
        bos.write(data, 0, count);
    }
    //Have to call flush or the  file can get corrupted.
    bos.flush();
    bos.close();

4。阅读XML

        // Get our factory and PullParser
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser xpp = factory.newPullParser();

        // Open up InputStream and Reader of our file.
        FileInputStream fis = ctx.openFileInput("Events.xml");
        BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"UTF-8"));


        // point the parser to our file.
        xpp.setInput(reader);

        // get initial eventType
        int eventType = xpp.getEventType();

        // Loop through pull events until we reach END_DOCUMENT
        while (eventType != XmlPullParser.END_DOCUMENT) {
            // Get the current tag
            String tagname = xpp.getName();

            // React to different event types appropriately
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if (tagname.equalsIgnoreCase(KEY_SITE)) {
                        // If we are starting a new <site> block we need
                        //a new StackSite object to represent it
                        curStackSite = new StackSite();

                    }
                    break;

                case XmlPullParser.TEXT:
                    //grab the current text so we can use it in END_TAG event
                    curText = xpp.getText();

                    break;

                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase(KEY_EVENT)) {
                        // if </event> then we are done with current Event
                        // add it to the list.
                        stackSites.add(curStackSite);
                    } else if (tagname.equalsIgnoreCase(KEY_NAME)) {
                        // if </name> use setName() on curSite
                        curStackSite.setName(curText);
                    } else if (tagname.equalsIgnoreCase(KEY_LINK)) {
                        // if </link> use setLink() on curSite
                        curStackSite.setLink(curText);
                    } else if (tagname.equalsIgnoreCase(KEY_ABOUT)) {
                        // if </about> use setAbout() on curSite
                        curStackSite.setAbout(curText);
                    } else if (tagname.equalsIgnoreCase(KEY_IMAGE_URL)) {
                        // if </image> use setImgUrl() on curSite
                        curStackSite.setImgUrl(curText);
                    } else if (tagname.equalsIgnoreCase(KEY_DATE)) {
                        // if </date> use setDate() on curSite
                        curStackSite.setDate(curText);
                    }
                    break;

5。我的问题

除了在TextView中显示“Ö,Ä,Ü”之类的字符外,本代码中的所有内容基本上都应该正常工作。 TextView总是给我一个“?”而不是“Ü,Ä,..”。所以我试着用谷歌喂给我的每一种方式解决这个问题,但我无法解决这个问题。

我尝试更改缓冲区“byte data [] = new byte [1024];”更大的东西,而不是BufferedInputStream我尝试了InputStreamReader ecc。

我观察到的是:在“ANSI”-Code中使用记事本保存我的XML工作正常,用“UTF-8”保存它根本不起作用,我从读者那里得不到任何东西。

我还想展示一些表情符号,但这是问题的第二部分。首先显示“Ü,Ä,Ö”会更重要。

显示/布局

这是我显示页面的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:padding="10dp"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/schalt2"
xmlns:android="http://schemas.android.com/apk/res/android"

    >

    <ImageView
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:id="@+id/iconImg"

    />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/event_title"
    android:textColor="@android:color/white"
    android:padding="4dp"
    android:textStyle="bold"
    android:textSize="22sp"
    android:layout_below="@id/iconImg"
    />

    <TextView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:id="@+id/event_date"
    android:textStyle="bold"
    android:textSize="14sp"
    android:padding="5dp"
    android:textColor="@android:color/white"
    android:layout_below="@id/event_title"/>

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/eventdescriptlong"
    android:layout_below="@id/event_title"
    android:padding="28dp"
    android:textColor="@android:color/white"
    />

因此,如果我尝试使用像这样的TextView:

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/eventdescriptlong"
    android:layout_below="@id/event_title"
    android:text="ÜÖÄ"
    android:textColor="@android:color/white"
    />

它得到了正确的显示。

1 个答案:

答案 0 :(得分:0)

解决了,问题如下:

将文件保存在UTF-8字符集中,在本地解析它会在XML前面添加这3个字节

https://i.stack.imgur.com/c7uqI.png[enter此处的图片说明] [1]

所以你绝对需要添加这一行:             fis.skip(3);

希望这可以帮助你们:)