unicode和简单xml错误


error with unicode and simple xml

我尝试用Simple XML向XML对象添加字符串。

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

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

但是它给出了一个警告:

PHP警告:SimpleXMLElement::__construct(): Entity:第1行:解析器错误:PCDATA无效Char值2在/home/nmo2e7/prog. PHP第5行

和最后一个异常,消息字符串不能解析为XML

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

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

如何从字符串中删除Unicode ?

它不是Unicode,而是两个多余的字节,值为'x01'x02。您可以使用str_replace:

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

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

传递的字符串

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

不是格式良好的XML,因为它包含超出XML字符范围的字符,即:

  • Unicode字符'START OF TEXT' (U+0002)在二进制偏移量24
  • Unicode字符'START OF HEADING' (U+0001)在二进制偏移量25
因此,不是使用SimpleXMLElement从手工修改的XML字符串创建它(容易出错),而是使用它来创建您正在寻找的XML。让我们举个例子。

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

$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,它将失败并给您(重要的)错误。

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