【问题标题】:Decoding XML from UTF-8 to ISO-8859-1 in PHP在 PHP 中将 XML 从 UTF-8 解码为 ISO-8859-1
【发布时间】:2014-11-19 08:52:30
【问题描述】:

我正在尝试“解码”一个 XML 文件(并使用 XSLT 对其进行转换),但是我在解码这两个文件时遇到了问题。场景如下:

我有一个数据输入站点,它全部以 ISO-8859-1 编码(我们的 Oracle 数据库就是这种格式,所以我无法更改它)。问题是,我有这两个文件(一个用于显示数据输入表单的 XML 和一个用于将其转换为 HTML 的 XSLT)。这两个文件都以 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、问号或双问号。

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

我错过了什么?有解决方法吗?由于数据库,我无法将任何内容转换为 UTF-8。

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

提前致谢!

【问题讨论】:

  • 你能给我们看看 XML/XSL 文件的 XML 声明吗?它应该包含文件的编码。您需要向浏览器发送您使用 XSLT 生成的编码。在 XML 上调用 utf8_decode 不会更改声明,这很有可能会破坏 XML。我不认为 importStylesheet() 可以加载 SimpleXMLElement。 ...作为一般规则,您希望在应用程序的任何位置使用 UTF-8 并将任何内容转换为此编码,设置所有连接到它,...
  • @ThW,当然。您是指 XML/XSL 上的“标题”吗?如果是这样,对于 XSL 文件:w3.org/1999/XSL/Transform"> 对于 XML:Invex1Invex 顺便说一句,XML/XSL 组合显示正确,特殊字符除外。
  • 编辑: 在 中添加了编码选项,因此现在可以读取 ,但它也不起作用。
  • 尝试直接在浏览器中打开 XML/XSL。如果直接打开文件,请检查浏览器是否可以显示特殊字符。声明说它是 ISO-8859-1,这种编码与 UTF-8 共享前 127 个代码点。所有其他都以多个字节(2-4)编码。再次将 ISO-8859-1 转换为 UTF-8 到 ISO-8859-1 将破坏特殊字符。 DOMDocument 在内部使用 UTF-8。如果您从 DOM 读取值,它将是 UTF-8。但如果您保存 XML/HTML,它会将其转换回 ISO-8859-1。您是否向浏览器发送内容类型标头?
  • XML 显示正确,因为它是使用 ISO88591 编码保存的,并且在 XSL 和 XML 端都正确发送了标头。我认为我的问题与您所说的 DOMDocument 使用 UTF8 更相关。由于 PHP 页面在 ISO88591 中并且 XML 文件是使用 UTF8 读取的,因此后者似乎弄乱了我的整个设置。为了清楚起见,PHP 脚本加载并显示了来自 XML/XSL 组合的条目表单。我不知道我是否正确理解了你的最后一个问题。不是 XSL 在 xsl:output 中发送标头吗?我应该以其他方式发送吗?谢谢!

标签: php xml encoding utf-8 iso-8859-1


【解决方案1】:

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

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);
?>

删除 utf_decode 语句,它就像一个魅力。现在,我按预期将我的特殊字符显示在屏幕上。作为副作用,在表单中输入的数据现在已正确保存到我的数据库中,所以我一口气得到了两只鸟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多