首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想在XML文件中遇到特殊的UTF-8字符时抛出异常

我想在XML文件中遇到特殊的UTF-8字符时抛出异常
EN

Stack Overflow用户
提问于 2014-07-28 19:18:15
回答 3查看 693关注 0票数 1

我正在解析一个使用UTF-8编码的XML文件。

<?xml version="1.0" encoding="UTF-8"?>

现在,我们的业务应用程序有一组组件,这些组件由不同的团队开发,并且不使用相同的库来解析XML。我的组件使用JAXB,而其他一些组件使用SAX等等。现在,当XML文件包含特殊字符,如"ä“、"ë”或"é“(带有变音字符)时,JAXB可以正确地解析它,但其他组件(子应用程序)无法正确解析它们并抛出异常。

由于业务需要,我不能更改其他组件的编程,但我必须在我的应用程序中设置限制/验证,以确保XML (数据加载)文件不包含任何此类字符。

什么是确保文件不包含上述(或类似)字符的最佳方法,并且可以在开始使用JAXB解析XML文件之前抛出异常(或给出错误)。

EN

回答 3

Stack Overflow用户

发布于 2014-07-28 19:45:48

如果您的客户发送给您的XML文件的头中的编码与文件内容不匹配,您不妨放弃尝试并对该文件执行任何有意义的操作。-他们是否真的在发送报头与实际编码不匹配的数据?那么这就不是XML了。你应该向他们收取更高的费用;-)

只需将文件作为FileInputStream逐字节读取即可。如果它包含负字节值,则拒绝处理它。

您可以保留像UTF-8或ISO 8859-1这样的编码设置,因为它们都将US-ASCII作为正确的子集。

票数 1
EN

Stack Overflow用户

发布于 2014-07-28 19:58:56

是的,我的回答和劳恩提到的一样……

代码语言:javascript
复制
static boolean readInput() {
    boolean isValid = true;
    StringBuffer buffer = new StringBuffer();
    try {
        FileInputStream fis = new FileInputStream("test.txt");
        InputStreamReader isr = new InputStreamReader(fis);
        Reader in = new BufferedReader(isr);
        int ch;
        while ((ch = in.read()) > -1) {
            buffer.append((char)ch);
            System.out.println("ch="+ch);
            //TODO - check range for each character 
            //according the wikipedia table http://en.wikipedia.org/wiki/UTF-8
            //if it's a valid utf-8 character
            //if it's not in range, the isValid=false;
            //and you can break here...
        }
        in.close();
        return isValid;
    } 
    catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

我只是添加了一个代码片段...

票数 1
EN

Stack Overflow用户

发布于 2014-07-28 20:37:02

您应该能够将XML输入包装在java.io.Reader中,在其中指定实际的编码,然后正常处理。Java将利用在InputStream中指定的编码,但是当使用Reader时,将使用Reader的编码。

代码语言:javascript
复制
Unmarshaller unmarshaller = jc.createUnmarshaller();
InputStream inputStream = new FileInputStream("input.xml");
Reader reader = new InputStreamReader(inputStream, "UTF-16");
try {
    Address address = (Address) unmarshaller.unmarshal(reader);
} finally  {
    reader.close();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24994107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档