先贴代码:
/*Unicode 编码*/
function unicode_encode($name){
//$name = iconv('UTF-8', 'UCS-2', $name); //windows
$name = iconv('UTF-8', 'UCS-2BE', $name); //linux
$len = strlen($name);
$str = '';
for ($i = 0; $i < $len - 1; $i = $i + 2){
$c = $name[$i];
$c2 = $name[$i + 1];
if (ord($c) > 0){
$str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
}else{
$str .= $c2;
}
}
return $str;
}
没有注释过的代码在Windows环境下是编码正常的,但在Linux下转换出来的两个字符是相反的,用在线unicode转换工具出来的结果是乱码。
那么解决方法也很简单 直接用我上面Linux的代码就可以了
UCS-2的编码规则:
windows下默认是UCS-2LE。
linux下默认是UCS-2BE。用iconv(指定UCS-2)来转换生成的是UCS-2BE的unicode,但可能php环境配置会导致不是UCS-2BE。
windows和linux等多个平台对 UCS-2 的理解不同(UCS-2LE,UCS-2BE),所以为了统一需要直接指定为UCS-2BE。
即把:
$name = iconv('UTF-8', 'UCS-2', $name); //windows
改为:
$name = iconv('UTF-8', 'UCS-2BE', $name); //linux
亲测转换出来的unicode可以正常编码。