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

时间:2017-05-22 19:53:08

标签: java xml unicode character-encoding flying-saucer

当我的应用程序中的表单被提交时,它会在客户端转换为HTML字符串,如下所示:

<?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服务)以删除任何<script>标记等。

在服务器上,我规范化/清理HTML,然后使用flying saucer Java library将此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"

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

在服务器上检查时该值的显示方式

原始HTML值

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

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

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

  

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

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

1 个答案:

答案 0 :(得分:4)

0xb(又名垂直标签 不是allowed character in XML

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

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

在将数据与任何XML库一起使用之前,必须手动或自动将其删除为 文本,而不是XML, ,从而修复数据。

另见: