PHP iconv 函数在 Linux 主机上不起作用


php iconv function not working on linux hosting

请查看以下代码:

<?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托管中解决此问题?提前谢谢。

UTF-16 有两种变体:大端序和小端序。它们在代码单元中的字节顺序上有所不同:字符 U+1234 在大端序中编码为 ''x12'x34',但在小端序中编码为''x34'x12'

看起来iconv在不同的系统上假设不同的版本。您可以使用utf-16be使其在所有系统上使用大端版本:

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