简单谈谈php中的unicode和utf8编码


Posted in PHP onJune 10, 2015

重新认识unicode和utf8编码

直到今天,准确的说是刚才,我才知道UTF-8编码和Unicode编码是不一样的,是有区别的??br /> 他们之间是有一定的联系的,看看他们的区别:
UTF-8的长度是不一定的,有可能是1、2、3字节
Unicode长度一定,2个字节(USC-2)
UTF-8可以和Unicode互相转换

unicode和utf8的关系

Unicode(16进制)

UTF-8(二进制)

0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

上面的表格有2个意思,第一个显而易见就是说Unicode和UTF-8字符范围的对应,还有一个可以看出Unicode怎么和UTF-8互相转换:

先说UTF-8到Unicode的转换

UTF-8编码的二进制和上面的3种格式进行匹配,匹配到之后去掉固定位(表格中的非x位置),然后从右到左每8位一组,不够8位左边不领,凑够2个字节16 bits,这16 bits所表示的就是UTF-8对应的Unicode编码,看看下面几个例子:

简单谈谈php中的unicode和utf8编码

上面图片中的文字编码格式为UTF-8,可以用WinHex看到其16进制表示

字符 => UTF-8   => UTF-8二进制=> 去掉固定位置凑够16位的二进制 => 16进制
汉  => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49

字  => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57
#下面是在chrome命令行下面运行的结果

'\u6C49'

"汉"

'\u5B57'

"字"
#到这里的话,从UTF-8转换到Unicode已经是一件非常容易的事了,看看转换的伪代码

读取一个字节,11100110

判断该UTF-8字符的格式,属于第三种,3个字节

继续读取2个字节得到 11100101 10101101 10010111

按照格式去掉固定位     1011011 01010111

不够16位,左边补零    01011011 01010111  => 5B57

再看看从Unicode到UTF-8的转换

5B57

获取5B57所在的Unicode范围,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三个字节,形式为1110xxxx 10xxxxxx 10xxxxxx

获取5B57的二进制编码 101101101010111

用上一步骤的二进制编码从右至左拼接UTF-8编码 11100101 10101101 10010111

说说问题

再说说今天这个问题的起因,从前端输入很多单词,UTF-8格式每个词最多30个字节,因此会在前端和后台分别做验证,javascript用的是Unicode编码,后端程序用的是UTF-8编码,现在的解决办法是这样

前端

function utf8_bytes(str)
{
 var len = 0, unicode;
 for(var i = 0; i < str.length; i++)
 {
 unicode = str.charCodeAt(i);
 if(unicode < 0x0080) {
  ++len;
 } else if(unicode < 0x0800) {
  len += 2;
 } else if(unicode <= 0xFFFF) {
  len += 3;
 }else {
  throw "characters must be USC-2!!"
 }
 }
 return len;
}

#例子
utf8_bytes('asdasdas')
8
utf8_bytes('yrt燕睿涛')
12

后台

#对于GBK字符串
$len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);
#对于UTF8字符串
$len = ceil(strlen(bin2hex($word))/2);

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
判断PHP数组是否为空的代码
Sep 08 PHP
php的hash算法介绍
Feb 13 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
Jul 18 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
PHP XML和数组互相转换详解
Oct 26 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
php实现页面纯静态的实例代码
Jun 21 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
PHP与Perl之间知识点区别整理
Mar 19 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 PHP
PHP中生成UUID自定义函数分享
Jun 10 #PHP
php使用for语句输出三角形的方法
Jun 09 #PHP
php生成图片验证码
Jun 09 #PHP
php判断用户是否手机访问代码
Jun 08 #PHP
浅谈PHP中Stream(流)
Jun 08 #PHP
php实现有趣的人品测试程序实例
Jun 08 #PHP
老版本PHP转义Json里的特殊字符的函数
Jun 08 #PHP
You might like
用PHP生成静态HTML速度快类库
2007/03/18 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
javascript的几种写法总结
2016/09/30 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
JS实现判断有效的数独算法示例
2019/02/25 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
Vuex模块化应用实践示例
2020/02/03 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
js实现电灯开关效果
2021/01/19 Javascript
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
python实现维吉尼亚算法
2019/03/20 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
2014年女职工工作总结
2014/11/27 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
如何用Navicat操作MySQL
2021/05/12 MySQL
无线电知识基础入门篇
2022/02/18 无线电
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL