输出UTF-16?有点卡住了

时间:2010-08-17 21:11:04

标签: php utf-16 surrogate-pairs

我的代理对形式中有一些UTF-16编码字符。我想在屏幕上输出这些代理对作为字符。

有谁知道这是怎么回事?

2 个答案:

答案 0 :(得分:3)

iconv('UTF-16', 'UTF-8', yourString)

答案 1 :(得分:1)

你的问题有点不清楚。

如果您的ASCII文本包含嵌入的UTF-16转义序列,则可以通过以下方式将所有内容转换为UTF-8:

function unescape_utf16($string) {
    /* go for possible surrogate pairs first */
    $string = preg_replace_callback(
        '/\\\\u(D[89ab][0-9a-f]{2})\\\\u(D[c-f][0-9a-f]{2})/i',
        function ($matches) {
            $d = pack("H*", $matches[1].$matches[2]);
            return mb_convert_encoding($d, "UTF-8", "UTF-16BE");
        }, $string);
    /* now the rest */
    $string = preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
        function ($matches) {
            $d = pack("H*", $matches[1]);
            return mb_convert_encoding($d, "UTF-8", "UTF-16BE");
        }, $string);
    return $string;
}

$string = '\uD869\uDED6';
echo unescape_utf16($string);

以UTF-8给出字符(因为它在BMP之外需要4个字节)。

如果你的所有文字都是UTF-16(包括HTML标签等),你只需告诉浏览器输出是UTF-16:

header("Content-type: text/html; charset=UTF-16");

这是非常罕见的,因为PHP脚本不能用UTF-16编写(除非PHP是用多字节支持编译的),这会使打印文字字符串变得笨拙。

因此,您可能只有UTF-16中的一段文本要转换为您的网页正在使用的编码。您可以使用以下命令执行此转换:

//replace UTF-8 with your actual page encoding
mb_convert_encoding($string, "UTF-8", "UTF-16");