用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 相关文章推荐
基于文本的留言簿
Oct 09 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
php常见的魔术方法详解
Dec 25 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
Smarty模板变量与调节器实例详解
Jul 20 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 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
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
php短址转换实现方法
2015/02/25 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
jquery延迟对象解析
2016/10/26 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python学习笔记_数据排序方法
2014/05/22 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
Python2随机数列生成器简单实例
2017/09/04 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
python类的实例化问题解决
2019/08/31 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
Python extract及contains方法代码实例
2020/09/11 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
联谊活动策划书
2014/01/26 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
男人帮观后感
2015/06/18 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书