请查看以下代码:
<?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);