采用 UTF-8 编码的 XML 文件包含十六进制 2026,这会弄乱 xerces



我有一个使用Xerces XML解析器的应用程序,它弄乱了一个文件,该文件可能打算在文本字段中有一个省略号(3点(字符。

该文件说它是 utf-8 编码:

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

有问题的字符串在记事本中如下所示:

<tvo:BuylineDescription>LOCAL NEWS …NOT AIRING 9/3</tvo:BuylineDescription>

即,Chrome和记事本都在那里看到一个省略号字符。 但是,如果我对文件进行十六进制转储,那么真正存在的是十六进制 2026,十六进制转储应用程序将其解释为空格和与号。

4C4F43414C204E45 575320264E4F5420 LOCAL NEWS &NOT
414952494E472039 2F333C2F74766F3A AIRING 9/3</tvo:

十六进制 2026 是省略号的 unicode 值,但这不是 unicode 文件。 好的,所以也许生成文件的应用程序只是以 unicode 复制,该文件是从某个地方复制/粘贴的(是的,我认为用户打算在那里使用省略号(。 但是,为什么这些应用程序将这个 2 字节序列解释为 UTF-8 XML 文件中的 unicode? 如果这些应用程序看到省略号,为什么它会搞砸Xerces? 即,这是否合法 UTF-8? 哦,这个文件是作为单个 SOAP"字符串"变量接收的 - 所以也许在传输过程中发生了一些代码转换......

底线是 - 我的应用程序无法处理此文件。 但是如果我用三个句点代替与号,Xerces 就没有问题了。 因此,要么我需要预扫描此字符序列并替换它,要么让发件人停止发送它。 但是,当然,在某些情况下,空格后跟与号是合法的,因此预扫描可能会变得棘手。

这是一个古老的问题,其他人早就想出了如何处理的方法吗? 我在这里看到很多类似的帖子 - 只是似乎没有什么完全匹配的。

这里肯定发生了一些奇怪的事情。如果文件确实包含两个字节 x20 x26,如您的十六进制转储所示,那么我看不出任何应用程序如何将其解释为省略号而不是(空格、& 符号(。

它是完全合法的 UTF-8。解释为 UTF-8,它是(空格,& 符号(,Xerces 令人窒息不是因为它是糟糕的 UTF-8,而是因为有一个 & 符号没有引入法人实体或字符引用。

省略号的 UTF-8 编码是三个字节,xE2 x80 xA6。

我总是怀疑十六进制转储。某些工具显示内存中的内容,而不是磁盘上的内容,并且并不总是相同的。如果我感到偏执,我会使用自己的代码将文件读取为字节流并以十六进制打印每个字节(撒克逊语中有代码可以做到这一点:java net.sf.saxon.functions.UnparsedText input.xml(

事实证明,原始 XML 文件包含一个有效的 xE2 x80 xA6 UTF-8 省略号,但位于我和文件创建者之间的存储转发框正在损坏它。 不知道具体如何,但我知道存储转发框将 XML 文本临时存储在 SQL Server 数据库中。 所以,我的猜测是它将其存储在无法处理 UTF-8 的文本字段中,这就是损坏发生的地方。

值得一提的是,Xerces 可以很好地处理良好的 UTF-8 省略号,但是它(或我的应用程序(截断了省略号处的字符串。 我再说一天。 很高兴知道 gSoap 不会在传输过程中损坏 UTF-8 文本。

最新更新