linux下php中文UTF-8转换Unicode方法和注意事项
2018-02-15 02:06
766 查看
先说下遇到问题:1.php没有内置unicode_ecode函数可以直接使用
2.网上很多资料都是用
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。
亲测转换出来的unicode可以正常转换的
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180215015823265-812553875.png)
下面是两个本人亲测可以使用的函数(为了避免以后跟系统新的内置函数同名在前面加了个my前缀):
测试代码:
输出结果:
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180215020137874-922253604.png)
在站长工具里可以正常转换,说明没有问题。
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180215015823265-812553875.png)
==========================
本人微信公众帐号: 心禅道(xinchandao)
![](https://images2015.cnblogs.com/blog/47685/201705/47685-20170515020215603-690137219.jpg)
![](https://images2015.cnblogs.com/blog/47685/201703/47685-20170302095446688-1399397474.jpg)
本人微信公众帐号:双色球预测合买(ssqyuce)
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180212161628156-2027511216.png)
囤币一族(tunbitt)公众号二维码
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可以正常转换的
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180215015823265-812553875.png)
下面是两个本人亲测可以使用的函数(为了避免以后跟系统新的内置函数同名在前面加了个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>';
输出结果:
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180215020137874-922253604.png)
在站长工具里可以正常转换,说明没有问题。
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180215015823265-812553875.png)
==========================
本人微信公众帐号: 心禅道(xinchandao)
![](https://images2015.cnblogs.com/blog/47685/201705/47685-20170515020215603-690137219.jpg)
![](https://images2015.cnblogs.com/blog/47685/201703/47685-20170302095446688-1399397474.jpg)
本人微信公众帐号:双色球预测合买(ssqyuce)
![](https://images2017.cnblogs.com/blog/47685/201802/47685-20180212161628156-2027511216.png)
囤币一族(tunbitt)公众号二维码
相关文章推荐
- PHP正则表达式 中文匹配 UTF-8编码下的的注意事项
- C#中文和UNICODE字符转换方法
- 【谨慎】ANSI与Unicode转换的注意事项
- 也谈UTF-8转换为Unicode方法
- 用php截取utf-8中文字符串乱码的解决方法
- C#中文和UNICODE字符转换方法
- C#中文和UNICODE字符转换方法
- GBK Unicode UTF 一点转换方法收集
- php中iconv函数使用方法 php 字符集转换 GBK 转 UTF-8
- PHP相关系列 - linux环境下PHP无法读取CSV文件中文字的解决方法
- php实现长连接的方法和注意事项
- struts中ApplicationResources.propertices文件的中文-unicode转换方法
- 简体中文转换城unicode(utf-8)
- PHP应用程序数据库编码转换(如GBK转UTF-8或UTF-8转GBK)注意事项
- 在J2ME实现UTF-8转换为Unicode编码的方法
- PHP静态方法的几个注意事项
- 中文账号显示问题 【UTF-8 转换成 多字节 Unicode】
- 将unicode编码的中文汉字转变成UTF-8编码的php程序
- Linux下从unicode到UTF-8的转换,含实例
- mysql中文排序注意事项与实现方法