简单 XML 和法语字符


SimpleXML and french characters

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

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

从我通读的各个页面中,我发现SimpleXML将XML处理为UTF-8。例如:PHP SimpleXML返回的值有奇怪的字符代替连字符和撇号

所以我在页面顶部做了:

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
            (
            )
    )

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

'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)

但这些也无济于事。有什么建议吗?

我在 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,第一个回声将正确显示得不好,但第二个和print_r($parser)就可以了。否则,如果浏览器设置为ISO-8859-1,那么您将看到第一个回声良好,但看不到第二个和print_r。

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

更新

ISO/IEC 8859-1 缺少法语和芬兰语文本以及欧元符号的某些字符。如果我很好地理解您的评论,您可以将源文件 (xml( 放在 ISO-8859-15 中,这样您就可以正确使用欧元符号。我制作了一个名为 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(,您可以在写入数据库之前对其进行转换(如果我正确理解的话,这是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>";

如您所见,我在 ISO-8859-15 中转换了 simpleXml 中的UTF-8数据,就像您在 DB 上编写时应该做的那样。这对我有用。

希望对你有帮助

如果生成 XML,请尝试对所有字符串进行 base64 解码,然后在客户端读取 XML 编码它们

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