我在一家国际公司工作,因此我们有很多语言可以满足。 我遇到了一些特殊字符的问题。
我创建了一个独立的测试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)
但这些也没有帮助。 有什么建议吗?
答案 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-1
到UTF-8
的转换,之后使用SimpleXMLElement
进行解析。
我在
<?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上写的那样。
这对我有用。
希望有所帮助