如何在Java中读取特定字符代码中的XML响应

时间:2013-01-06 06:00:12

标签: java xml character-encoding mediawiki domdocument

我使用Wikimedia API Sandbox for Japanese。

Japanese Version

English Version

我向维基媒体发送HTTP请求,我得到一个用XML格式化的结果。 当我尝试在API Sandbox网页上发送请求并获得结果时,结果中没有字符损坏。

但是当我在Java中得到结果时,结果包括字符损坏。

我无法在XML文件中分配特定的字符代码。

如何为特定字符代码分配结果? 我该如何解决我的问题?

  try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db
                .parse(new URL(
                        "http://ja.wikipedia.org/w/api.php?action=query&prop=categories&format=xml&cllimit=10&titles="
                                + key).openStream());
        Element root = doc.getDocumentElement();
        NodeList queryList = root.getChildNodes();
        Node query = queryList.item(0);
        if (query instanceof Element) {
            Element queryEle = (Element) query;
            NodeList pagesList = queryEle.getChildNodes();
            Node pgs = pagesList.item(0);
            if (pgs instanceof Element) {
                Element pagesElement = (Element) pgs;
                NodeList pageList = pagesElement.getChildNodes();
                Node page = pageList.item(0);
                if (page instanceof Element) {
                    Element pageElement = (Element) page;
                    String title = pageElement.getAttribute("title");
                    title = new String(title.getBytes("UTF-8"), "UTF-8");
                }
            }
        }
    } catch (ParserConfigurationException e) {
    } catch (SAXException e) {
    } catch (IOException e) {
    }

现在我发送request,我得到了一个页面标题为“大学”的结果。但在Java中,它显示“??”。

我在Android应用程序上使用上面的代码。

1 个答案:

答案 0 :(得分:0)

title = new String(title.getBytes("UTF-8"), "UTF-8");可以省略。

对我来说,key = 1(接收UTF-8)。我有一台UTF-8 Linux PC。也许你没有输出UTF-8上下文。尝试将Document写入文件。

你可以做更多的检查:

URLConnection connection = new URL("...").openConnection();
... connection.getContentEncoding();
... connection.getContentType();
InputStream in = connection.openStream();