PHP 的 XML 字符编码问题
Posted
技术标签:
【中文标题】PHP 的 XML 字符编码问题【英文标题】:XML character encoding issue with PHP 【发布时间】:2013-01-29 02:30:42 【问题描述】:我有创建 XML 的代码,我唯一的问题是 á、olá 和 ção 等单词的编码。 这些字符显示不正确,当我尝试读取 XML 时,我收到与该字符相关的错误。
$dom_doc = new DOMDocument("1.0", "utf-8");
$dom_doc->preserveWhiteSpace = false;
$dom_doc->formatOutput = true;
$element = $dom->createElement("hotels");
while ($row = mysql_fetch_assoc($result))
$contact = $dom_doc->createElement( "m" . $row['id'] );
$nome = $dom_doc->createElement("nome", $row['nome'] );
$data1 = $dom_doc->createElement("data1", $row['data'] );
$data2 = $dom_doc->createElement("data2", $row['data2'] );
$contact->appendChild($nome);
$contact->appendChild($data1);
$contact->appendChild($data2);
$element->appendChild($contact);
$dom_doc->appendChild($element);
我可以改变什么来解决我的问题,我使用的是 utf-8???
【问题讨论】:
你能显示你得到的错误,和/或当你在编辑器中打开 xml 时字符的样子吗? 我得到解析错误,然后在他们的地方奇怪的字符 看看实际的奇怪字符和错误会很好 参见***.com/questions/2790027/… 我认为从数据库中获取的数据需要先转换为UTF-8,然后再从中创建元素。 【参考方案1】:请尝试在脚本中直接输入“á”、“olá”或“ção”。
$data1 = $dom_doc->createElement("data1", 'ção');
如果您没有问题,这可能是您从 mysql 获取的数据编码错误。 你确定你的 mysql 输出正确的 UTF-8 吗?
要知道这一点,让您的 php 将您的数据转储到 html 文档中,并将元标记设置为 UTF-8,然后查看字符是否正确显示。
你也可以调用:
$data1 = $dom_doc->createElement("data1", mb_detect_encoding($row['data']));
并查看 PHP 为您的数据检测到什么编码。
如果您无法转换数据库中的数据或更改其设置,您可以使用 mb_convert 即时进行:http://www.php.net/manual/en/function.mb-convert-encoding.php
【讨论】:
【参考方案2】:您使用的是 utf-8,即 8 位 unicode 编码格式。即使它正确支持 Unicode 中的所有 1,112,064 个代码点,这里也可能存在问题。 尝试 UTF-16 作为标准,只是一个想法。见下文:
$dom_doc = new DOMDocument("1.0", "utf-16");
或
$dom_doc = new DOMDocument("1.0", "ISO-10646");
【讨论】:
如果 UTF-16 工作正常,那么您的数据库可能会充满来自 Windows 系统的数据。我听说他们默认使用 UTF-16... 关于 UTF-8 的位和代码点的数量无关。 虽然 utf-16 并不是一个很好的编码,但最好先转换成 utf-8,然后再插入到 xml 中以上是关于PHP 的 XML 字符编码问题的主要内容,如果未能解决你的问题,请参考以下文章
带有 php 和重音字符以及 ENT_XML1 的 XML 的 UTF-8 编码