当前位置: 首页 > 知识库问答 >
问题:

奇怪的Unicode字符导致XML解析失败

奚昌胤
2023-03-14

当我的应用程序中的表单提交时,它将(在客户端)转换为超文本标记语言字符串,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="en" lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head> 
  <style type="text/css">
    td { white-space: normal; }
  </style>
</head>
<body>
<table>
    <tbody>
    <!-- Repeat for every field in the form -->
    <tr>
        <td>Name</td>
        <td>John Doe</td>
    </tr>
    </tbody>
</table>
</body>
</html>

作为转换过程的一部分,每个字段值都被清理(通过Angular的$sanitize服务)以删除任何

在服务器上,我规范化/清除HTML,然后使用飞碟Java库将XML/CSS转换为PDF。

为了测试表单,我有一个工具,可以用随机值引导字段。此工具经常使用奇怪的unicode字符引导字段,这些字符会导致PDF转换器失败,因为它们不被视为有效的XML字符。

其中一个价值如下:

> $('input[name="postcode"]').val();
< "h5    9gx"

> encodeURI($('input[name="postcode"]').val());
< "h5%E2%80%82%0B%E2%80%A9%E2%80%89%E2%80%A9%E2%80%82%E2%80%88%0B9gx"

在浏览器中,它看起来像“h5”和“9gx”,由几个空格分隔,但它们绝对不是空格

原始HTML值

<td>h5&#8194;&#11;&#8233;&#8201;&#8233;&#8194;&#8200;&#11;9gx</td>

在规范化/清理HTML之后,看起来原始HTML中的XML实体已转换为空格,但同样,它们肯定不是空格。

无论它们是什么,都会导致XML解析器抛出此异常

SAXParseException;在文档的元素内容中发现无效的XML字符(Unicode:0xb)。

如何在客户端或服务器端安全地删除/替换/清理/编码这些值?


共有1个答案

黄淇
2023-03-14

0xb(也称为垂直选项卡)在XML中是不允许的字符:

[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

因此,您的数据不是XML,任何符合XML的处理器都必须报告一个错误,例如您收到的错误。

在将数据与任何XML库一起使用之前,您必须手动或自动将其视为文本而不是XML,从而通过删除任何非法字符来修复数据。

另见:

  • Java:从java中的字符串中删除无效的XML字符
  • JavaScript:在使用XMLSerializer()序列化XML之前,从XML中删除无效字符
 类似资料:
  • 问题内容: 我有一个带有unicode字符的json文件,但我无法解析它。我已经在Flash CS5(JSON库)中进行了尝试,并且在http://json.parser.online.fr/中进行了尝试,但我始终会收到“意外令牌- 评估失败” 抱歉,语法确实存在问题,它是通过客户端发送的。 有人可以帮帮我吗?谢谢 问题答案: RFC: JSON文本应以Unicode编码。默认编码为UTF-8。

  • 我有一个输入表单,允许某人键入unicode字符。所以它可能是类似于“嘿,uF32A怎么了?如果我得到这个字符串,它将有一个子字符串“\uF32A”,我如何将其转换为字符“\uF32A”?

  • 我正在编写一个DocumentFilter,它将输入JTextField的所有单词“top”替换为逻辑top符号。 使用此代码很好,但是它很烦人,因为用户必须重新键入他们的空间,他们可以这样做,并且文本继续在同一行上 当用户继续键入文本时,使用此代码并在空格中添加替换符会导致顶部符号和JTextField中的所有文本稍微向上推,然后转到下面并开始一行新的内容 有人能解释一下这种行为,并希望能提供一

  • 问题内容: 我有一些奇怪的字符串池行为的问题。我正在使用比较相等的字符串来找出它们是否在池中。 输出为: 这对我来说是一个很大的惊喜。有人可以解释一下吗?我认为这是在编译时发生的。但是,为什么添加到String 根本没有任何区别呢? 问题答案: 是一个编译时常量,而 不是。因此,前者仅编译为字符串常量“ 555”,而后者则编译为实际的方法调用和串联,从而生成一个新的String实例。 另请参见JL

  • 问题内容: 我有一些带有一些整数的PHP代码,并且一切正常,除非我拥有或作为整数。当我引用它们时,一切都很好。 示例编号: 谁能告诉我背后的原因? 问题答案: 如果您只写08和09(不带引号)或任何其他带有前导0的数字,则PHP认为您正在写一个八进制值,而08和09是无效的八进制数。 http://www.php.net/manual/zh/language.types.integer.php 句

  • 那么,我的问题是,有没有一种方法,我可以异步读取我的JSON文件块,不超过256MB的缓冲区长度,而不手动传播我的JSON数据到几个文件?