从XML读取UTF-16(或UTF-8)值并使用PHP显示结果

时间:2010-01-29 19:24:02

标签: php xml encoding utf-8 utf-16

我在unicode(UTF-16)值和PHP / XML方面遇到了很多麻烦。我想从XML中读取一组unicode值,并将正确的字形输出到浏览器。我尝试过使用UTF-8,我也遇到了同样的问题。

这是我用于第一次测试的简单工作示例:

$text = "\x00\x41";

$text = mb_convert_encoding($text, "ASCII", "UTF-16");

echo $text;

输出上述代码:

A

但是,当我尝试从XML获取值时,事情就会停止工作。

XML:

<glyphs>
    <code>0041</code>
    <code>0042</code>
    <code>0043</code>
    <code>0044</code>
    <code>0045</code>
    <code>0046</code>
</glyphs>

在php中,我从上面的xml读取每个值,分成对和格式,例如\ x00 \ x41等

PHP:

// load xml
$xml = simplexml_load_file('encoding.xml');

if ($xml) {

    // get families
    foreach($xml->children() as $item) {

        $pairs = str_split($item, 2);

        $hex = "\x" . $pairs[0] . "\x" . $pairs[1];

        // check value...
        echo $hex . '<br/>';

        $text = mb_convert_encoding($hex, "ASCII", "UTF-16");

        echo $text;
    }

}
else {
    return 'The input is malformed.';
}

浏览器输出:

\x00\x41
????
\x00\x42
????
\x00\x43
????
\x00\x44
????
\x00\x45
????
\x00\x46
????

问号应为A,B,C,D,E,F。

我做错了什么?

感谢。

3 个答案:

答案 0 :(得分:1)

“\ x00”是字符串中的十六进制表示法,在编译时处理。
我认为当你使用“\ x”+“00”时,编译器首先试图找出“\ x”是什么(我不知道结果是什么),然后才连接“00”,所以结果不是你所期望的。

也许这个问题可以帮助,虽然它是在Java中 - &gt; Java: Convert String "\uFFFF" into char

编辑:只是跟进评论。将文字“\ x41”放在xml中也无济于事,因为那时你正在读一个包含4个字符的字符串。
因此,您的问题可以重述为:如何使用UTF-16将十六进制数值的字符串表示形式转换为单个字符。这是我在上面链接的问题中遇到的问题,除了你想在php而不是Java中进行。

答案 1 :(得分:1)

您的测试程序为每个测试字符写入几个ASCII字符,后跟ASCII中的“
”,后跟两个字节的UTF-16。这不行。一个文件一次只能使用一个字符编码。

首先,重写脚本以将所有输出转换为UTF-16(或其他)。

其次,您的浏览器似乎将您的混合编码文件解释为UTF-16以外的其他内容,可能是ISO 8859-1或Windows Latin 1,它们是常见的默认值。浏览器不太可能将文件解释为UTF-16 unless explicitly directed to (in the HTTP header or content type meta tag)。如果您未指定内容类型(检查您的Web服务器是否正在发送默认值),则某些浏览器会尝试猜测编码。我怀疑有人会猜你的混合文件是UTF-16。

在您确认浏览器根据您指定的内容类型解释文件之前,不要指望任何内容可以正常工作。

最后,我建议使用iconv而不是mb_convert_encoding。 iconv得到了更好的维护,并且拥有更广泛的支持编码。

答案 2 :(得分:0)

您是否在标题中正确设置输出?

header('Content-Type: text/html; charset=utf-8');

...还有HTML头?

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />