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

UTF-8编码的XML文件包含十六进制2026,这会弄乱xerces,xml,unicode,utf-8,ellipsis,Xml,Unicode,Utf 8,Ellipsis,我有一个使用Xerces XML解析器的应用程序,它会搞乱一个文件,该文件可能打算在文本字段中使用省略号(3点)字符 文件上说它是utf-8编码的: <?xml version="1.0" encoding="utf-8"?> 这个字符串在记事本中看起来像这样: <tvo:BuylineDescription>LOCAL NEWS …NOT AIRING 9/3</tvo:BuylineDescription> 本地新闻…9/3不播出 i

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

文件上说它是utf-8编码的:

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

这个字符串在记事本中看起来像这样:

   <tvo:BuylineDescription>LOCAL NEWS …NOT AIRING 9/3</tvo:BuylineDescription>
本地新闻…9/3不播出
i、 例如,Chrome和记事本都可以看到其中的省略号。但如果我对文件进行十六进制转储,实际上是十六进制2026,十六进制转储应用程序将其解释为一个空格和一个符号

4C4F43414C204E45 575320264E4F5420 LOCAL NEWS &NOT
414952494E472039 2F333C2F74766F3A AIRING 9/3</tvo:
4C4F43414C04E45 575320264E4F5420本地新闻&非本地新闻

414952494E472039 2F333C2F74766F3A播放9/3这里肯定发生了一些奇怪的事情。如果文件真的包含十六进制转储显示的两个字节x20 x26,那么我看不出任何应用程序如何将其解释为省略号而不是(空格、符号和)

这是完全合法的UTF-8。被解释为UTF-8,它是(空格、符号)和Xerces阻塞不是因为它是坏的UTF-8,而是因为有一个符号没有引入法律实体或字符引用

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


我总是怀疑六角垃圾堆。有些工具向您显示内存中的内容,而不是磁盘上的内容,而且它们并不总是相同的。如果我觉得有点偏执,我会使用自己的代码将文件作为字节流读取,并以十六进制打印每个字节(Saxon中有这样做的代码:
java net.sf.Saxon.functions.UnparsedText input.xml

原来的xml文件包含有效的xE2 x80 xA6 UTF-8省略号,但我和文件创建者之间的一个存储转发框正在破坏它。我不知道确切的方式,但我知道store and forward框将XML文本临时存储在SQL Server数据库中。所以,我猜它存储在一个无法处理UTF-8的文本字段中,这就是发生损坏的地方


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

Umm。这个十六进制转储是由我编写的一个程序生成的,该程序将文件作为字节流读取,并以十六进制打印每个字节。。。但是“od”和其他实用程序显示相同的顺序。但是在任何情况下,我怀疑你是对的,关于Xerces认为这个符号是一个特殊字符序列的开始,但是被接下来的事情弄糊涂了。因此,考虑到这一点——事实上,我无法让发送者修复它,或者让Xerces来处理它,你会建议我如何预扫描这些XML文件,用无害的东西来替换这些符号——而不破坏真正的符号和标记字符?为了它的价值,我们的系统管理员已经通过一个脚本来处理这些文件,该脚本使用sed替换不应该存在的其他讨厌的字符。但是这个符号是一个完全有效的字符-除了它位于错误的位置之外…所以你已经在修补一个已知编码错误的文件,而你的修补程序并没有解决整个问题?恐怕这是解决编码问题的典型管道胶带解决方案。您需要找出坏数据进入系统的位置,并在源位置进行修复。