【问题标题】:error with unicode and simple xmlunicode 和简单 xml 错误
【发布时间】:2015-12-03 04:24:04
【问题描述】:

我尝试使用简单 XML 将字符串添加到 XML 对象。

示例 (http://ideone.com/L4ztum):

 $str = "<aoc> САМОЛЕТОМ ТК Адамант,  г.Домодедово, мкр-н Востряково, Центральный просп. д.12</aoc>";

$movies = new SimpleXMLElement($str);

但它给出了一个警告:

PHP 警告:SimpleXMLElement::__construct(): Entity: line 1: parser error: PCDATA invalid Char value 2 in /home/nmo2E7/prog.php on line 5

最后是一个带有消息的异常String could not be parsed as XML

如果我删除两个 Unicode 字符,它会起作用 (http://ideone.com/LaMvHN):

$str = "<aoc> САМОЛЕТОМ ТК Адамант,  г.Домодедово, мкр-н Востряково, Центральный просп. д.12</aoc>";
                          ^
                           `-- two invisible characters have been removed here

如何从字符串中删除 Unicode?​​p>

【问题讨论】:

标签: php xml unicode


【解决方案1】:

SimepleXMLElement 的构造函数需要它的第一个参数是格式良好的 XML。

你传递的字符串

$str = "<aoc> САМОЛЕТОМ\x02\x01 ТК Адамант,  г.Домодедово, мкр-н Востряково, Центральный просп. д.12</aoc>";

不是格式良好的 XML,因为它包含 character-range of XML 之外的字符,即:

  • Unicode 字符 'START OF TEXT' (U+0002) 在二进制偏移 24 处
  • 二进制偏移量 25 处的 Unicode 字符 'START OF HEADING' (U+0001)

因此,不要使用 SimpleXMLElement 从手工修改的 XML 字符串( 容易出错)创建它,而是使用它来创建你想要的 XML寻找。举个例子吧。

在下面的示例中,我假设您已经获得了要为其创建 XML 元素的文本。此示例创建一个类似于您问题中的 XML 元素,不同之处在于将完全相同的字符串作为文档元素 ("&lt;aoc&gt;") 的文本内容传入。

$text     = 'САМОЛЕТОМ ТК Адамант,  г.Домодедово, мкр-н Востряково, Центральный просп. д.12';
$xml      = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><aoc/>');
$xml->{0} = $text; // set the document-element's text-content to $text

这样做后,SimpleXML 将为您过滤所有无效的控制字符,并且 SimpleXMLElement 保持稳定:

$str    = $xml->asXML();
$movies = new SimpleXMLElement($str);
print_r($movies);

/* output:

SimpleXMLElement Object
(
    [0] => САМОЛЕТОМ ТК Адамант,  г.Домодедово, мкр-н Востряково, Центральный просп. д.12
)

*/

所以最后回答你的问题:

如何从字符串中删除 Unicode?​​p>

您不想从字符串中删除 Unicode。 SimpleXML 库仅接受 Unicode 字符串(采用 UTF-8 编码)。您想要的是删除对 XML 使用无效的 Unicode 字符。当您设置节点值时,SimpleXML 库会为您做到这一点。

但是,如果您尝试通过构造函数或构造函数(simplexml_load_string 等)加载格式不正确的 XML,它将失败并给您(重要的)错误。

我希望这可以为您澄清情况并回答您的问题。

【讨论】:

    【解决方案2】:

    它不是 Unicode,而是两个杂散字节,值 \x01\x02。您可以使用str_replace 过滤掉它们:

    $s = str_replace("\x01", "", $s);
    $s = str_replace("\x02", "", $s);
    

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      相关资源
      最近更新 更多