XML编码问题


貌似这篇东西是处女博。其实之前也写几篇了,不过没什么技术含量的,就删了。从今天开始要重新开始写技术博客。

回到正题,昨天一个小问题搞了近两个小时。不废话,直接上代码。

$xml=
'<xml><OpenId><![CDATA[xxxxxxxNgWULgu-Jv_jfC928]]></OpenId>
<AppId><![CDATA[xxxx83e551aff]]></AppId>
<TimeStamp>1400209273</TimeStamp>
<MsgType><![CDATA[request]]></MsgType>
<FeedBackId>000006772525503242</FeedBackId>
<TransId><![CDATA[000001201405163250631108]]></TransId>
<Reason><![CDATA[没有收到货品]]></Reason>
<Solution><![CDATA[补发货给我]]></Solution>
<ExtInfo><![CDATA[测试维权 00000629]]></ExtInfo>
<AppSignature><![CDATA[60000000b124f2bba96555a40f6876eda]]></AppSignature>
<SignMethod><![CDATA[s0000]]></SignMethod>
</xml>';
$xml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
//昨天在服务器用这个方法解析XML报错。而在本地一点问题都有。无法解释。蛋疼了很久。
//然后换了一种方法看看报什么错
try {
	$xml = new SimpleXMLElement($xml,LIBXML_NOCDATA);
} catch (Exception $e) {
	echo $e->getMessage();
	exit;
}
//结果:String could not be parsed as XML
//尼玛,我也知道无法解析,但你要告诉我为什么啊。然后google,找到了下面这个测试代码
function isXML($xml){
   libxml_use_internal_errors(true);
   $doc = new DOMDocument('1.0', 'utf-8');
   $doc->loadXML($xml);
   $errors = libxml_get_errors();

   if(empty($errors)){
       return true;
   }

   $error = $errors[0];
   if($error->level < 3){
       return true;
   }


   $explodedxml = explode("r", $xml);
   $badxml = $explodedxml[($error->line)-1];


   $message = $error->message . ' at line ' . $error->line . '. Bad XML: ' . htmlentities($badxml);
   return $message;
}
echo isXML($xml);
//出现了这样的东西
//Input is not proper UTF-8, indicate encoding ! Bytes: 0xD3 0xD0 0xCA 0xD5 at line 7. Bad XML: 
//到了这步终于有了点眉目了,编码出现了问题。

$xml = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?>' .$xml, 'SimpleXMLElement', LIBXML_NOCDATA);

//然后还是出问题了。我开始有点蛋碎。究竟什么问题。
//好了,突然灵机一动,想起了文件编码。一看,ASCII,记事本!!
//终于找到问题,把文件的编码方式更为utf-8.
//问题解决。


真蛋疼。显然,这个文件不是我建的。。。
实际上上面那个东西,如果全是英文的话,是不会报错的,但包含中文就报错了。我对编码不了解,也解释不了其中的原因。暂且略过。
刚刚在看w3cshool教程的时候,刚看到的。


错误消息

如果您试图向 IE 中载入 XML 文档,可能会得到两种指示编码问题的错误:

在文本内容中发现非法字符

如果 XML 文档中的某个字符与编码属性不匹配,您就会得到这个错误消息。通常,当 XML 文件中含有外国字符,且当文件使用类似记事本的单字节编码编辑器保存,以及没有指定编码属性时,您就会得到这个错误消息。

将当前编码切换为不被支持的指定编码

如果您的文件被保存为 Unicode/UTF-16,但是编码属性被指定为单字节编码(比如 Windows-1252、ISO-8859-1 或者 UTF-8)时,那么您就会得到这个错误消息。或者当您的文档被保存为单字节编码,但编码属性被指定为双字节编码(比如 UTF-16)时,也会得到这个错误消息。


早点看到就好了。各位要引以为戒。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值