unicode和简单的xml错误

时间:2015-09-07 15:03:15

标签: php xml unicode

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

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

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

$movies = new SimpleXMLElement($str);

但是它发出警告:

  

PHP警告:SimpleXMLElement :: __ construct():实体:第1行:解析器错误:第5行/home/nmo2E7/prog.php中的PCDATA无效字符值2

最后 Exception ,消息 String无法解析为XML

如果我删除两个Unicode字符,它可以工作(http://ideone.com/LaMvHN):

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

如何从字符串中删除Unicode?

2 个答案:

答案 0 :(得分:0)

它不是Unicode,而是两个杂散字节,值为\x01\x02。您可以使用str_replace

过滤掉它们
$s = str_replace("\x01", "", $s);
$s = str_replace("\x02", "", $s);

答案 1 :(得分:0)

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

您传递的字符串

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

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

  • Unicode字符&#39; START OF TEXT&#39; (U + 0002)二进制偏移24
  • Unicode字符&#39; START OF HEADING&#39; (U + 0001),二进制偏移25

因此,不要使用 SimpleXMLElement 从手工破坏的XML字符串( 容易出错)创建它,而是使用它来创建XML&#39 ;寻找。让我们举个例子。

在下面的示例中,我假设您已经获得了要创建XML元素的文本。此示例创建一个类似于您的问题中的XML元素,区别在于完全相同的字符串作为文档元素的文本内容传递(&#34; <aoc>&#34;)。

$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?

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

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

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