错误:
警告:simplexml_load_string() [function.simplexml负载字符串]: 实体:第3行:解析器错误:输入 是不正确的UTF-8,表示编码 !字节:0xE7 0x61 0x69 0x73
来自数据库的XML(来自FF中的视图源的输出):
<?xml version="1.0" encoding="UTF-8" ?><audit><audit_detail>
<fieldname>role_fra</fieldname>
<old_value>Role en français</old_value>
<new_value>Role ç en français</new_value>
</audit_detail></audit></xml>
如果我理解正确,则该错误与old_value标记中编码的第一个ç有关。确切地说,错误与字节有关:“çais”?
以下是我加载XML的方法:
$xmlData = simplexml_load_string($ed['updates'][$i]['audit_data']);
I循环使用:
foreach ($xmlData->audit_detail as $a){
//code here
}
数据库中的字段是数据类型文本,设置为utf8_general_ci。
我创建audit_detail存根的功能:
function ed_audit_node($field, $new, $old){
$old = htmlentities($old, ENT_QUOTES, "UTF-8");
$new = htmlentities($new, ENT_QUOTES, "UTF-8");
$out = <<<EOF
<audit_detail>
<fieldname>{$field}</fieldname>
<old_value>{$old}</old_value>
<new_value>{$new}</new_value>
</audit_detail>
EOF;
return $out;
}
数据库中的插入是这样完成的:
function ed_audit_insert($ed, $xml){
global $visitor;
$sql = <<<EOF
INSERT INTO ed.audit
(employee_id, audit_date, audit_action, audit_data, user_id)
VALUES (
{$ed[emp][employee_id]},
now(),
'{$ed[audit_action]}',
'{$xml}',
{$visitor[user_id]}
);
EOF;
$req = mysql_query($sql,$ed['db']) or die(db_query_error($sql,mysql_error(),__FUNCTION__));
}
最奇怪的部分是以下工作(虽然没有xml声明)在一个简单的PHP文件中:
$testxml = <<<EOF
<audit><audit_detail>
<fieldname>role_fra</fieldname>
<old_value>Role en français</old_value>
<new_value>Role ç en français</new_value>
</audit_detail></audit>
EOF;
$ xmlData = simplexml_load_string($ testxml);
有人可以帮助解释一下吗?
编辑#1 - 我现在正在使用DOM来构建XML文档,并且已经摆脱了错误。功能在这里:
$dom = new DomDocument();
$root = $dom->appendChild($dom->createElement('audit'));
$xmlCount = 0;
if($role_fra != $curr['role']['role_fra']){
$root->appendChild(ed_audit_node($dom, 'role_fra', $role_fra, $curr['role']['role_fra']));
$xmlCount++;
}
...
function ed_audit_node($dom, $field, $new, $old){
//create audit_detail node
$ad = $dom->createElement('audit_detail');
$fn = $dom->createElement('fieldname');
$fn->appendChild($dom->createTextNode($field));
$ad->appendChild($fn);
$ov = $dom->createElement('old_value');
$ov->appendChild($dom->createTextNode($old));
$ad->appendChild($ov);
$nv = $dom->createElement('new_value');
$nv->appendChild($dom->createTextNode($new));
$ad->appendChild($nv);
//append to document
return $ad;
}
if($xmlCount != 0){
ed_audit_insert($ed,$dom->saveXML());
}
但是,我认为我现在有一个显示问题,因为本文“Roééleçséenfranêais”(new_value)显示为:
显示问题:
在我的HTML文档中,我对内容类型有以下声明(遗憾的是,我没有按住键进行更改):
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
...
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
我已尝试使用iconv()转换为ISO-8859-1,但是,在进行转换时,大多数特殊字符都被删除了。剩下的就是“Ro”使用这个命令:
iconv('UTF-8','ISO-8859-1',$node->new_value);
iconv输出:
db中的字段是:utf8_general_ci。但是,连接字符集将是默认值。
不太确定从哪里开始...
编辑#2 - 我尝试了utf8_decode以查看是否会有所帮助,但事实并非如此。
utf8_decode($a->new_value);
输出:
我还注意到我在db中的字段确实包含UTF-8。哪个好。
答案 0 :(得分:3)
当ç
是“ç”时,您的编码是Windows-1252(或者可能是ISO-8859-1),但不是UTF-8。