用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模板页面中分页代码的解析
Feb 06 PHP
php 定义404页面的实现代码
Nov 19 PHP
php cli模式学习(PHP命令行模式)
Jun 03 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
PDO::rollBack讲解
Jan 29 PHP
PHP7引入的"??"和"?:"的区别讲解
Apr 08 PHP
PHP使用HTML5 FormData对象提交表单操作示例
Jul 02 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 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
探讨方法的重写(覆载)详解
2013/06/08 PHP
PHP Class&Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php的ddos攻击解决方法
2015/01/08 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
深入理解Python爬虫代理池服务
2018/02/28 Python
python如何实现反向迭代
2018/03/20 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
Python几种常见算法汇总
2020/06/02 Python
python中操作文件的模块的方法总结
2021/02/04 Python
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
优秀本科生求职推荐信
2014/02/24 职场文书
劲霸男装广告词
2014/03/21 职场文书
意向书范文
2014/03/31 职场文书
平安工地建设方案
2014/05/06 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
求职信如何撰写?
2019/05/22 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
python垃圾回收机制原理分析
2022/04/13 Python