2

请查看以下代码:

<?php
    function unicode_decode($str){

            return preg_replace("/\\\u([0-9A-F]{4})/ie", "iconv('utf-16', 'utf-8',hex2str(\"$1\"))", $str);    

    }

function hex2str($hex) {

    $r = '';

    for ($i = 0; $i < strlen($hex) - 1; $i += 2)

    $r .= chr(hexdec($hex[$i] . $hex[$i + 1]));

    return $r;

}
$var="\u092e\u0941\u0930\u0932\u0940 \u0938\u093e\u0930";
$var =  unicode_decode($var);
echo $var;
?>

此代码在 Windows 托管中完美运行,输出为“मुरली सार”。但是,在linux主机上,它的输出是随机的,显示为汉字“⸉䄉〉㈉䀉㠉㸉”。似乎 linux 托管不适用于 php 的 inconv 功能。

如何在 linux 主机中解决这个问题?提前致谢。

4

1 回答 1

1

UTF-16 有两种变体:big-endian 和 little-endian。它们在代码单元中的字节顺序不同:字符 U+1234 将被编码为'\x12\x34'big-endian,但编码为'\x34\x12'little endian。

看起来 iconv 在不同的系统上假设不同的版本。您可以使用以下命令在所有系统上使用 big-endian 版本utf-16be

return preg_replace("/\\\u([0-9A-F]{4})/ie", "iconv('utf-16be', 'utf-8',hex2str(\"$1\"))", $str);    
于 2013-09-17T23:05:11.623 回答