如何从Oracle字符进行编码,以XML?(How to encode characters fro

2019-07-28 19:36发布

在这里我的环境我使用Java序列化结果设置为XML。 这种事基本上是这样的:

//foreach column of each row
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = rs.getString(i);
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");

该XML看起来像这样在Firefox:

<row num="69004">
    <column num="1">10069</column>
    <column num="2">sd&#26;</column>
    <column num="3">FCVolume                      </column>
</row>

但是,当我解析XML,我得到了一个

org.xml.sax.SAXParseException:字符引用“&#26”是无效的XML字符。

我现在的问题是:我在使用哪个本地字符替换或我怎么有编码我的人物,他们将是有效的XML?

Answer 1:

我发现了一个有趣的列表XML规范 :根据该列表中的泄气使用的字符#26(十六进制:#X1A)。

在下列范围内所定义的字符也气馁。 他们要么是控制字符或永久未定义的Unicode字符

看到完整的范围 。

此代码替换字符串中的所有非有效的XML UTF8:

public String stripNonValidXMLCharacters(String in) {
    StringBuffer out = new StringBuffer(); // Used to hold the output.
    char current; // Used to reference the current character.

    if (in == null || ("".equals(in))) return ""; // vacancy test.
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i);
        if ((current == 0x9) ||
            (current == 0xA) ||
            (current == 0xD) ||
            ((current >= 0x20) && (current <= 0xD7FF)) ||
            ((current >= 0xE000) && (current <= 0xFFFD)) ||
            ((current >= 0x10000) && (current <= 0x10FFFF)))
            out.append(current);
    }
    return out.toString();
}    

从它拍摄无效XML字符:当有效的UTF8并不意味着有效的XML

但与我有还是UTF-8配伍问题:

org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence

看完XML -从servlet返回的XML为UTF-8我只是想,如果我设置的contentType这样会发生什么:

response.setContentType("text/xml;charset=utf-8");

和它的工作....



Answer 2:

可扩展标记语言(XML)1.0表示:

与符号字符(&)和左尖括号(<)不能出现在它们的字面的形式,作为标记定界符时,或注释,处理指令,或CDATA段内除外。 如果在其他地方需要,他们必须使用“&”和“<”分别要么数字字符引用或字符串进行转义。 右尖括号(>)可以使用字符串来表示“>”,并且必须为相容性,在内容使用任一“>”或一个字符引用当它出现在字符串中“]]>”,当被转义串不表示一个CDATA段的结束。

如果使用CDATA可以跳过编码:

<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>


Answer 3:

哪个版本的JRE,你运行? SAX项目说:

J2SE 1.4捆绑的旧版本SAX2的。 如何使SAX2 R2或更高版本可用?



文章来源: How to encode characters from Oracle to XML?