用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 分页分组类
Dec 10 PHP
晋城吧对DiscuzX进行的前端优化要点
Sep 05 PHP
学习php笔记 字符串处理
Oct 19 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
给ECShop添加最新评论
Jan 07 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
Yii2 queue的队列使用详解
Jul 19 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
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
Python类的基础入门知识
2008/11/24 Python
python中的函数用法入门教程
2014/09/02 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Python中for循环控制语句用法实例
2015/06/02 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
python上selenium的弹框操作实现
2020/07/13 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
总经理助理工作职责
2014/02/06 职场文书
倡议书范文
2014/04/16 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
运动会的口号
2014/06/09 职场文书
2014年网管工作总结
2014/12/11 职场文书