【发布时间】:2015-02-23 11:56:01
【问题描述】:
我有一些 XML 内容 (UTF-8),其中包含无效字符(当我尝试使用 Nokogiri::XML(content) 解析内容时,nokogiri 告诉我 Line 2190, SyntaxError: PCDATA invalid Char value 15)。
字符在 Sublime Text 编辑器中显示为“SI”:
当我尝试复制角色时,没有任何内容被复制,所以我什至无法查找。例如,当我在我的 Atom 编辑器中打开它时,不会显示“SI”。但是,当我用右键遍历字符时,我必须键入两次才能越过放置“SI”字符的位置。
首先,这是一个什么样的角色?第二:Ruby中有没有办法删除这些字符。我用content.chars.select{|i| i.valid_encoding?}.join 试过了,但它没有删除字符。
更新
我通过用 ruby 读取原始文件找到了这个字符。字符为\u000F,"\u000F".ord 返回字符代码15。关于http://www.fileformat.info/info/unicode/char/000f/index.htm,这是一个SHIFT IN 字符。还有其他类似的角色吗?我可以使用str.split("\u000F").join 删除它们,但如果还有其他类似的字符,这似乎不是一个好方法。有什么想法吗?
【问题讨论】:
-
如果您从可以影响或控制的来源接收 XML,那么最好的解决方法是在来源处正确转义(或删除,如果它根本不应该存在)字符 -如有必要,通过提交错误报告。解析器准确地抱怨。尝试猜测 XML 中的其他问题并预处理 XML 直到其格式正确是可能的,但会很丑陋并且仅适用于这一来源。
-
很遗憾,我无法控制源。好的,也许我只是等到下一个错误发生,将此字符添加到列表中并再次等待;)
-
一般解决方案的一个问题是,在 CDATA 块中,这些坏字符有时是可以的。如果它在数据中是有原因的(记录分隔符),那么您可能更愿意用正确转义的版本替换它。
-
嗯,你是对的。你能举一个这样的坏角色的例子吗?
标签: ruby encoding character-encoding special-characters