0

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

我创建了一个独立的测试 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 DB,所以显示不太重要。它虽然像这样在FF上显示

print $xml;
���$`~ � � � � � � � � � 124

然后我创建 SimpleXML 对象:

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

这打印出来:

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

    )

我不太担心 print $xml; 中的有趣字符,但更需要修复插入数据库的 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)

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

4

3 回答 3

2

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

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

然后我将内容加载到 php 文件中并进行从ISO-8859-1到的转换UTF-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 编码,第一个回显将无法正确显示,但第二个和print_r($parser). 否则,如果浏览器设置为 ISO-8859-1,那么您将看到第一个 echo 好,但第二个和 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 编码,第一个回显将不会正确显示,但第二个和print_r($parser)SimpleXml 的输出会正常。

因此,现在您已经正确地(在UTF-8)中解析了 xml,您可以在写入 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 上编写时应该做的那样。这对我有用。

希望能帮助到你

于 2013-09-27T12:23:17.480 回答
0

如果您构建 XML,请尝试对所有字符串进行 base64 解码,然后在读取 XML 的客户端将它们编码回来

于 2013-09-27T10:24:19.503 回答
-1

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

于 2013-09-27T10:24:41.800 回答