PHP:简单的XML和不同的代码页并正确获取数据

时间:2011-02-10 15:37:25

标签: php xml character-encoding codepages

我正在处理这个项目,我收到来自不同来源的不同XML文件。我的PHP脚本应该读取它们,解析它们并将它们存储到mysql数据库中。

要解析XML文件,我使用PHP中的SimpleXMLElement类。我收到来自比利时的UTF-8编码文件,来自德国的iso-8859-1编码,来自捷克共和国的cp1250,依此类推......

当我将xml-data传递给SimpleXMLElement并在此对象上打印asXML()时,我会正确地看到xml数据与原始xml文件中的数据一样。 当我尝试将字段分配给PHP变量并在屏幕上打印此变量时,文本看起来已损坏,当插入mysql数据库时当然也会损坏。

示例:

XML:

<?xml version="1.0" encoding="cp1250"?>
...
<name>Labe Dìèín - Rozb 741,85km  ;  Dìèín - Rozb 741,85km </name>
...

PHP代码:

$sxml = file_get_contents("test.xml");
$xml = new SimpleXMLElement($sxml);
//echo $xml->asXML() . "\n"; // content will show up correctly in the shell
$name = (string)$xml->ftm->fairway_section->geo_object->name;
echo $name . "\n";

代码的结果(在linux bash shell上)向上移动光标然后打印:bÃn - Rozb 741,85km; DÄ(光标移动当然与PHP打印出的错误字符有关)

我认为PHP将其数据转换为UTF-8以将其存储在字符串参数中,因此我假设使用mb_convert_encoding从UTF-8转换为cp1250将显示正确的结果,但事实并非如此。此外,我应该能够以可与所有其他来源组合的格式存储数据。

我对编码/代码页知之甚少,这可能是我无法正常工作的原因,但我所知道的是,如果我将来自不同语言的文本复制/粘贴到例如新的UltraEdit文件,所有这些都显示正确。 UltraEdit如何处理这个问题?它是否使用UTF-8(我认为可以显示任何内容?)

如何转换我的数据,以便它始终显示在源上的任何编码?

2 个答案:

答案 0 :(得分:2)

请尝试iconv

$str = iconv('UTF-8', 'WINDOWS-1250', $str);

答案 1 :(得分:0)

问题是您的输入文件格式不正确。在Windows-1250中没有字符ì(拉丁文小写字母I with grave)。请参阅here

最接近的角色是U+00ED(拉丁文小写字母,有急促)。

这样的角色在shell中正确显示的事实可能是偶然的。