修复XML中的字符编码

时间:2014-02-14 14:26:46

标签: php xml unicode character-encoding postscript

我正在编写一个XML,它将成为PostScript表单的假脱机。

每当人们插入字符EN DASH(可能是复制形式的MS Word)时,我会得到offending command: xmlerror. Stack: unicode not supported yet ....

http://www.fileformat.info/info/unicode/char/2013/index.htm

代码的相关部分是:

$xml = new SimpleXMLElement('<xml/>');
foreach( $_POST as $key => $value ) {
    $xml->$key = $value:
}
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->asXML());
$nombreArchivoTemporal = '/tmp/'.time().rand();
$archivo = fopen ( $nombreArchivoTemporal, "wb" );
fwrite ( $archivo, iconv('UTF-8', 'CP1252//TRANSLIT//IGNORE', "@PBSSFORM DNDA\n" . $dom->saveXML()) );
fclose ( $archivo );

事实是支持ÄËÏÖÜáéíóú, etc个字符,但EN DASH和其他可能不支持iconv个字符。我试图用$xml函数去除它们但似乎不起作用,因为当我插入<?xml version="1.0"?> <xml> <date/> <tituloObra>&#xE1;&#xE9;&#xED;&#xF3;&#xFA;&#xC1;&#xC9;&#xCD;&#xD3;&#xDA;&#xE4;&#xEB;&#xEF;&#xF6;&#xFC;&#xC4;&#xCB;&#xCF;&#xD6;&#xDC; &#x2013; &lt;= gui&#xF3;n</tituloObra> 时,该字符已经是html-entity编码:

&#x2013;

{{1}}是有问题的角色。

2 个答案:

答案 0 :(得分:2)

EN DASH U + 2013存在于CP1252中。名称CP1252是windows-1252的常用但非官方名称,在IANA注册表中定义,因此字节0x95代表U + 2013。

答案 1 :(得分:0)

问题是与SimpleXML有关的问题。我已经尝试了将SimpleXML转换为CP1252的所有内容,但当我在DOMDocument->loadXML中加载它时,我总是遇到Illegal character...错误

我已直接使用DOMDocument类替换它,在构造函数中指定CP1252并将新记录插入UTF8

当我呼叫DOMDOcument->Save()时,它会自动将文件编码为CP1252,避免PostScript中提到的错误。