0

我在使用 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。

我究竟做错了什么?

谢谢。

4

3 回答 3

1

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

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

其次,您的浏览器似乎将您的混合编码文件解释为 UTF-16、ISO 8859-1 或 Windows Latin 1 之外的其他东西,这些都是常见的默认值。除非明确指向(在 HTTP 标头或内容类型元标记中),否则浏览器不太可能将文件解释为 UTF-16 。如果您未指定内容类型(检查您的 Web 服务器是否发送默认值),那么某些浏览器会尝试猜测编码。我怀疑有人会猜你的混合文件是 UTF-16。

在您确认浏览器正在根据您指定的内容类型解释文件之前,不要期望任何东西都能按您的意愿工作。

最后,我推荐使用 iconv 而不是 mb_convert_encoding。iconv 维护得更好,并且具有更广泛的支持编码集。

于 2010-01-29T20:36:06.270 回答
1

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

也许这个问题会有所帮助,虽然它是在 Java -> Java: Convert String "\uFFFF" into char

编辑:只是跟进评论。在您的 xml 中放置文字“\x41”也无济于事,因为您正在读取一个由 4 个字符组成的字符串。
因此,您的问题可以重述为:如何使用 UTF-16 将十六进制数值的字符串表示形式转换为单个字符。这与我在上面链接的问题中的问题相同,只是您想在 php 中执行此操作,而不是 Java。

于 2010-01-29T20:00:05.423 回答
0

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

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

...以及在 HTML 头中?

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
于 2010-01-29T19:28:11.107 回答