【发布时间】:2018-09-01 12:24:43
【问题描述】:
我遇到了simplexml_load_string 错误的问题,由于 xml 有效负载来自包含 unicode 字符的数据库,导致解析错误。
我不知道如何让 php 读取此内容并像往常一样使用 xml。代码一直运行良好,直到人们对提交的数据产生创意。
不幸的是,我无法修改源数据,我必须使用我收到的数据,给你一个想法,在原始原始收据中破坏它的一个字段如下所示:
<FirstName>????</FirstName>
以前,代码通过使用简单的一行来解析 xml 就可以正常工作:
$xmlresult = simplexml_load_string($result, 'SimpleXMLElement',LIBXML_NOCDATA);
但是对于这些 unicode 字符,它只是错误。 如果我转储原始有效负载,则取决于我用来查看数据的内容:
<d83d><dc3a>
或<U+D83D><U+DC3A>
在堆栈上阅读了一下,似乎 DOM 可能工作,但在那里也没有任何运气。
传入的有效载荷确实有标头:
?xml version="1.0" encoding="UTF-8"?>
数据通过
<data type="cdata"><![CDATA[<payload>
我完全不知所措,希望能在这里得到一些帮助,让我克服这个数据处理的难题。
【问题讨论】:
-
`
`?假设这些是代码点,那就是 UTF-16 代理对,永远不应该出现在 UTF-8 中。 (这两个代码点都是无效的 Unicode 代码点,仅允许在一种特定编码中对 BMP 之外的字符进行编码。)我敢打赌,在某处,UTF-16 文本被视为 UCS-2,然后被转换为 UTF- 8,这些步骤都没有真正验证他们的数据。 -
我无法确认,但我相信这些数据是如何到达的,是由于在几个国家/地区收到的字符导致姓名和地址字段的验证被关闭,这导致了这个问题。但是我无法控制它,需要找到一种方法来使用它并阻止该脚本完全出错。