SimpleXML和法语字符

时间:2013-09-27 10:18:57

标签: php xml encoding simplexml special-characters

我在一家国际公司工作,因此我们有很多语言可以满足。 我遇到了一些特殊字符的问题。

我创建了一个独立的测试php页面,以消除我的系统可能引入的任何其他问题。

在我阅读的各个页面中,我发现SimpleXML将XML处理为UTF-8。 例如:PHP SimpleXML Values returned have weird characters in place of hyphens and apostrophes

所以我在页面顶部做到了这一点:

header("Content-type:text/html; charset=UTF-8");

我这样做是为了检查:

print mb_internal_encoding();

不确定这是否是正确的功能,但它在FF和Chome中给了我ISO-8859-1。

XML看起来像这样:

$xml = '<?xml version="1.0" encoding="ISO-8859-15"?>
<Tracking>
<File>
<FileNumber>çúé$`~  €   Š   š   Ž   ž   Œ   œ   Ÿ</FileNumber>
<OrigBranch>124</OrigBranch>
<Login></Login>
</File>
</Tracking>';

这打印出所有有趣的内容,但是对于我需要的页面,我不太具体化它在浏览器中的打印方式,因为实际页面实际上将从cron运行以将XML导入MYSQL数据库,因此不会显示太重要了。虽然

显示在FF上
print $xml;
���$`~ � � � � � � � � � 124

然后我创建SimpleXML对象:

$parser = new SimpleXMLElement($xml);
print_r($parser);

打印出来:

[File] => SimpleXMLElement Object
    (
        [FileNumber] => çúé$`~                           
        [OrigBranch] => 124
        [Login] => SimpleXMLElement Object
            (
            )

    )

我不太担心print $ xml中的有趣字符,但更需要修复插入到DB中的SimpleXMLElement对象中的字符。 为什么SimpleXMLElement对象在'〜'之后丢失了字符。我试图在标题函数调用中将字符集更改为ISO-8859-15,但这只会导致打印$ xml;看起来稍微好些,但在'〜'之后仍然缺少字符,但SimpleXMLElement会给出致命的错误:

'String could not be parsed as XML

我在解析XML之前尝试过:

$xml = mb_convert_encoding($xml, "ISO-8859-15");
$xml = iconv('UTF-8', 'ISO-8859-15//TRANSLIT', $xml)

但这些也没有帮助。 有什么建议吗?

3 个答案:

答案 0 :(得分:0)

如果您构建XML,请尝试对所有字符串进行base64解码,然后在客户端读取XML,然后再对其进行编码

答案 1 :(得分:0)

尝试$xml = '<?xml version="1.0" encoding="UTF-8"?>...

答案 2 :(得分:0)

我使用此内容在latin1(ISO-8859-1)中创建了一个名为latin1.xml的特定文件(您可以在xml标记中添加encoding="UTF-8",它是相同的):

<?xml version="1.0"?>
<Tracking>
<File>
<FileNumber>çùé$ °à §çòò àù§</FileNumber>
<OrigBranch>124</OrigBranch>
<Login></Login>
</File>
</Tracking>

然后我将内容加载到php文件中并进行从ISO-8859-1UTF-8的转换,之后使用SimpleXMLElement进行解析。 我在

之前回应了xml的内容
<?php
$xml = file_get_contents('latin1.xml');
echo '<pre>'.$xml.'</pre>'."<br>";
$xml2 = iconv("ISO-8859-1","UTF-8",$xml);
echo '<pre>'.$xml2.'</pre>'."<br>";
$parser = new SimpleXMLElement($xml2);
echo '<pre>'.print_r($parser).'</pre>'."<br>";

现在加载脚本,如果你的浏览器设置了UTF-8 econding,那么第一个echo将会正确显示,但第二个和print_r($parser)就可以了。否则,如果浏览器设置为ISO-8859-1,那么您将看到第一个回声良好,但不会看到第二个和print_r。

您可以根据自己的需要进行调整。

<强>更新

ISO / IEC 8859-1缺少法语和芬兰语文本的一些字符以及欧元符号。 如果我理解您的评论,您可以在ISO-8859-15中获得源文件(xml),这样您就可以正确使用欧元符号。 我创建了一个名为iso8859-15.xml的新文件,并在那里添加了新的测试字符(也带有欧元符号)。在php文件中,我更改了第一条指令:

//$xml = file_get_contents('latin1.xml');
$xml = file_get_contents('iso8859-15.xml');

以及后来的转换:

$xml2 = iconv("ISO-8859-15","UTF-8",$xml);

现在加载脚本,如果您的浏览器设置为UTF-8 econding,第一个回显将没有很好地显示,但第二个和print_r($parser),SimpleXml的输出将是正确的。

所以,既然你正确地解析了xml(在UTF-8中),你可以在写入DB之前转换它(如果我正确理解的话,那就是ISO-8859-15编码)。 为了更清楚,你可以在最后将这一行添加到上面的php脚本中:

echo '<pre> File number in ISO-8859-15 for db: '.iconv("UTF-8","ISO-8859-15",$parser->File->FileNumber).'</pre>'."<br>";

正如您所看到的,我在UTF-8中转换了来自simpleXml的ISO-8859-15数据,就像您在DB上写的那样。 这对我有用。

希望有所帮助