用PHP将Unicode 转化为UTF-8的实现方法(推荐)


Posted in PHP onFebruary 08, 2017

实例如下:

function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
  $ar = $r[0];
  //print_r($ar);
  foreach($ar as $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)));
    }
  }
  return join("",$ar);
}
echo unescape("紫星蓝");

今天有用户反馈,表单系统用户提交的数据中文会乱码。测试发现问题出在 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-2LE FFFE, UCS-2BE FEFF),以表明下面的字符是 unicode 并且判别 big-endian 或 little-endian。 所以从 windows 平台过来的数据发现有这个前缀,不用慌张。

5、 linux 的编码输出,比如从文件输出,从 printf 输出,需要控制台做适当的编码匹配(如果编码不匹配,一般和该程序编译时的编码有若干关系),而控制台的转换输入需要查看当前的系统编码。比如控制台当前的编码是 UTF-8, 那么 UTF-8 编码的东西能正确显示,GBK 就不能;同样,当前编码是 GBK, 就能显示 GBK 编码,后来的系统应该更智能的处理好更多的转换了。不过通过 putty 等终端还是需要设置好终端的编码转换以解除乱码的烦恼。

以上这篇用PHP将Unicode 转化为UTF-8的实现方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
基于php-fpm 参数的深入理解
Jun 03 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
php处理复杂xml数据示例
Jul 11 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
Yii框架的布局文件实例分析
Sep 04 PHP
设定php简写功能的方法
Nov 28 PHP
PHP如何防止用户重复提交表单
Dec 09 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
Mar 04 PHP
一键生成各种尺寸Icon的php脚本(实例)
Feb 08 #PHP
php正则提取html图片(img)src地址与任意属性的方法
Feb 08 #PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
Feb 08 #PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 #PHP
php获取文件名称和扩展名的方法
Feb 07 #PHP
php 常用的系统函数
Feb 07 #PHP
thinkphp修改配置进入默认首页的方法
Feb 07 #PHP
You might like
第1次亲密接触PHP5(2)
2006/10/09 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
详解php中 === 的使用
2016/10/24 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
javascript中var的重要性分析
2015/02/11 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python 中的int()函数怎么用
2017/10/17 Python
Python进程间通信Queue实例解析
2018/01/25 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python下载微信公众号相关文章
2019/02/26 Python
python实现杨氏矩阵查找
2019/03/02 Python
微信公众号token验证失败解决方案
2019/07/22 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
博士毕业生自我鉴定范文
2014/04/13 职场文书
体育口号大全
2014/06/18 职场文书
公共场所标语
2014/06/30 职场文书
新年晚会开场白
2015/05/29 职场文书
中学政教处工作总结
2015/08/13 职场文书
学习党章心得体会2016
2016/01/15 职场文书