用PHP将Unicode 转化为UTF-8的实现方法(推荐)
实例如下:
functionunescape($str){ $str=rawurldecode($str); preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r); $ar=$r[0]; //print_r($ar); foreach($aras$k=>$v){ if(substr($v,0,2)=="%u"){ $ar[$k]=iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4))); } elseif(substr($v,0,3)=="&#x"){ $ar[$k]=iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1))); } elseif(substr($v,0,2)=="&#"){ $ar[$k]=iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1))); } } returnjoin("",$ar); } echounescape("紫星蓝");
今天有用户反馈,表单系统用户提交的数据中文会乱码。测试发现问题出在iconv转换上。
iconv('UCS-2',
'GBK',
'中文')
Google
搜索发现,原因是Linux服务器上UCS-2编码方式与Winodws不一致。
于是,我改成
iconv('UCS-2BE',
'GBK',
'中文')
试试,中文正常了
以下是有关两个平台
UCS-2编码的潜规则:
1、 UCS-2不等于UTF-16。UTF-16每个字节使用ASCII字符范围编码,而UCS-2对每个字节的编码可以超出ASCII字符范围。UCS-2和UTF-16对每个字符至多占两个字节,但是他们的编码是不一样的。
2、对于UCS-2,windows下默认是UCS-2LE。用MultibyteToWidechar(或者A2W)生成的是UCS-2LE的unicode。windows记事本可以将文本保存为UCS-2BE,相当于多了层转换。
3、 对于UCS-2,linux下默认是UCS-2BE。用iconv(指定UCS-2)来转换生成的是UCS-2BE的unicode。如果转换windows平台过来的UCS-2,需要指定UCS-2LE。
4、鉴于windows和linux等多个平台对UCS-2的理解不同(UCS-2LE,UCS-2BE)。MS主张unicode有个引导标志(UCS-2LEFFFE,UCS-2BEFEFF),以表明下面的字符是unicode并且判别big-endian或little-endian。所以从windows平台过来的数据发现有这个前缀,不用慌张。
5、 linux的编码输出,比如从文件输出,从printf输出,需要控制台做适当的编码匹配(如果编码不匹配,一般和该程序编译时的编码有若干关系),而控制台的转换输入需要查看当前的系统编码。比如控制台当前的编码是UTF-8,那么UTF-8编码的东西能正确显示,GBK就不能;同样,当前编码是GBK,就能显示GBK编码,后来的系统应该更智能的处理好更多的转换了。不过通过putty等终端还是需要设置好终端的编码转换以解除乱码的烦恼。
以上这篇用PHP将Unicode转化为UTF-8的实现方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。