首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >涉及unicode和简单xml的错误

涉及unicode和简单xml的错误
EN

Stack Overflow用户
提问于 2015-09-07 15:03:15
回答 2查看 1.5K关注 0票数 4

我尝试用简单的XML向XML对象添加一个字符串。

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

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

$movies = new SimpleXMLElement($str);

但它发出了警告:

PHP警告: SimpleXMLElement::__construct():实体:第1行:解析器错误:第5行中的PCDATA无效Char值2 in /home/nmo2E7/prin.php

最后,不能将带有消息字符串的异常解析为XML。

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

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

如何从字符串中删除Unicode?

EN

回答 2

Stack Overflow用户

发布于 2015-09-07 15:21:04

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

代码语言:javascript
复制
$s = str_replace("\x01", "", $s);
$s = str_replace("\x02", "", $s);
票数 0
EN

Stack Overflow用户

发布于 2015-09-08 06:33:25

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

你传递的绳子

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

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

  • 二进制偏移量24处的Unicode字符‘开始文本’(U+0002)
  • 二进制偏移量25处的Unicode字符‘开始标题’(U+0001)

因此,不要使用SimpleXMLElement从一个手工损坏的XML -字符串(这是容易出错的)创建它,使用它来创建您要寻找的XML。让我们举个例子。

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

代码语言:javascript
复制
$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

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

代码语言:javascript
复制
$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,它将失败并给出(重要的)错误。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32441615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档