我在一家国际公司工作,因此我们有很多语言可以满足。我遇到了一些特殊字符的问题。
我创建了一个独立的测试 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-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 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"?>...