用PHP将XML从UTF-8解码为ISO-8859-1


Decoding XML from UTF-8 to ISO-8859-1 in PHP

我试图"解码"一个XML文件(并用XSLT转换它),但我在解码这两个文件时都遇到了问题。场景如下:

我有一个数据输入网站,它都是用ISO-8859-1编码的(我们的Oracle数据库是那种格式,所以我不能更改它)。问题是,我有这两个文件(一个XML显示数据输入表单,另一个XSLT将其转换为HTML)。这两个文件都以ISO-8859-1编码保存,并且都有相应的头,即,每当我读取文件并在浏览器中显示它们时,特殊字符(ñ,á,?)要么显示为UTF-8,要么显示为问号(取决于我使用的显示方法),但决不会显示为"正常"表示。

我显示XML文件的代码是:

<?php
$xslString = file_get_contents("catalog.xsl");
$xslString = utf8_decode($xslString);
$xslDoc = simplexml_load_string($xslString);
$xmlString = file_get_contents("questionnaire.xml");
$xmlString = utf8_decode($xmlString);
$xmlDoc = simplexml_load_string($xmlString);
$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
?>

我已经尝试了DOMDocument、iconv、mb_convert_encoding的几种组合,但它们将XML文件显示为未编码的UTF、问号或双问号。

另一方面,这也会打乱我的数据输入,因为如果我想输入其中一个字符,它们要么显示为?或在DB上相应的数据字段上,或者它们在第一个特殊字符处被截断(如果我使用iconv)。

我错过了什么?有变通办法吗?由于数据库的原因,我无法将任何内容转换为UTF-8。

我希望我说得足够清楚,请原谅我的英语。

提前感谢!

希望这能帮助其他人。最后,有两件事:

1) 我正在阅读这样的XML/XSL文件(在我的原始脚本中):

<?php
$xmlDoc = new DOMDocument();
$xmlDoc->loadXML($xmlFile);
$xmlDoc->load("xmlfile.xml");
?>

这有效地将编码更改为UTF-8。我把线路改成:

<?php
$xmlString = file_get_contents("xmlfile.xml");
$xmlDoc = simplexml_load_string($xmlString);
?>

删除utfdecode语句,它就像一个符咒。现在我把我的特殊字符按预期显示在屏幕上。副作用是,在表格中输入的数据现在正确地保存到了我的数据库中,所以我一次就得到了两只鸟。