【问题标题】:simplexml_load_string - parse error due to unicode characters in payloadsimplexml_load_string - 由于负载中的 unicode 字符导致解析错误
【发布时间】:2018-09-01 12:24:43
【问题描述】:

我遇到了simplexml_load_string 错误的问题,由于 xml 有效负载来自包含 unicode 字符的数据库,导致解析错误。

我不知道如何让 php 读取此内容并像往常一样使用 xml。代码一直运行良好,直到人们对提交的数据产生创意。

不幸的是,我无法修改源数据,我必须使用我收到的数据,给你一个想法,在原始原始收据中破坏它的一个字段如下所示:

<FirstName>????</FirstName>

以前,代码通过使用简单的一行来解析 xml 就可以正常工作:

$xmlresult = simplexml_load_string($result, 'SimpleXMLElement',LIBXML_NOCDATA);

但是对于这些 un​​icode 字符,它只是错误。 如果我转储原始有效负载,则取决于我用来查看数据的内容:

 <d83d><dc3a>

&lt;U+D83D&gt;&lt;U+DC3A&gt;

在堆栈上阅读了一下,似乎 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,这些步骤都没有真正验证他们的数据。
  • 我无法确认,但我相信这些数据是如何到达的,是由于在几个国家/地区收到的字符导致姓名和地址字段的验证被关闭,这导致了这个问题。但是我无法控制它,需要找到一种方法来使用它并阻止该脚本完全出错。

标签: php unicode simplexml


【解决方案1】:

我已经盯着这个看了好几天了,似乎我没有尝试的一件事是像这样用 utf8_encode 包装我的 curl 调用函数:

    $result = utf8_encode(do_curl($xmlbuildquery));

我的 do_curl 函数只是一个单独的函数来调用 curl 过程,仅此而已。 这样做,我可以解析结果,而不是显示那些 unicode 字符,而是显示为

[firstname] => 🐺

(以上是 print_r($result); 之后的结果
$xmldata = simplexml_load_string((string)$xmlresult->body->function->data);

有了这些,xml 现在终于可以解析了。奇怪的是,这进一步激发了我的好奇心,因为这些信息是通过导入 mysql 数据库的 csv 提供的,当我查找相同的记录时,它显示为:

 FirstName: ????

也设置了表格类型: FirstName varchar(40) 整理 utf8mb4_unicode_ci 非空,

这可能表明他们没有将输出 utf8_encoding 到 csv,与这个问题分开,但很有趣。

最后,我的脚本可以再次运行了!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多