您的位置:首页 > 运维架构 > Linux

linux下php中文UTF-8转换Unicode方法和注意事项

2018-02-15 02:06 766 查看
先说下遇到问题:1.php没有内置unicode_ecode函数可以直接使用

2.网上很多资料都是用
$str
= iconv(
$encoding
,
'UCS-2'
,
$str
);


window下转换出来的是正常的,但在Linux下转换出来的两个字符是相反的,用在线unicode转换工具出来的结果是乱码。

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。

即把:$str
= iconv(
$encoding
,
'UCS-2'
,
$str
); 改为
$str
[code]= iconv(
$encoding
,
'UCS-2BE'
,
$str
);


亲测转换出来的unicode可以正常转换的



下面是两个本人亲测可以使用的函数(为了避免以后跟系统新的内置函数同名在前面加了个my前缀):

 /**
* utf-8 转unicode
* @param string $name
* @return string
*/
function myutf8_unicode($name){
$name = iconv('UTF-8','UCS-2BE',$name);
$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 .= '\u'.str_pad(base_convert(ord($c2),10,16),4,0,STR_PAD_LEFT);
}
}
return $str;
}

/**
* unicode 转 utf-8
*
* @param string $name
* @return string
*/
function myunicode_decode($name)
{
$name = strtolower($name);
// 转换编码,将Unicode编码转换成可以浏览的utf-8编码
$pattern = '/([\w]+)|(\\\u([\w]{4}))/i';
preg_match_all($pattern,$name,$matches);
if (! empty($matches)) {
$name = '';
for ($j = 0; $j < count($matches[0]); $j ++) {
$str = $matches[0][$j];
if (strpos($str,'\\u') === 0) {
$code = base_convert(substr($str,2,2),16,10);
$code2 = base_convert(substr($str,4),16,10);
$c = chr($code) . chr($code2);
$c = iconv('UCS-2BE','UTF-8',$c);
$name .= $c;
} else {
$name .= $str;
}
}
}
return $name;
}


测试代码:

$ustr = myutf8_unicode('我的新衣');
echo '我的新衣:'.$ustr.'<br>';
$str = myunicode_decode($ustr);
echo $str.'<br>';


输出结果:



在站长工具里可以正常转换,说明没有问题。



==========================

本人微信公众帐号: 心禅道(xinchandao)







本人微信公众帐号:双色球预测合买(ssqyuce)



囤币一族(tunbitt)公众号二维码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: