简单谈谈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下检测字符串是否是utf8编码的代码
Jun 28 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
php str_pad() 将字符串填充成指定长度的字符串
Feb 23 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
php实现的用户查询类实例
Jun 18 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
Jan 07 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
Oct 08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 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性能优化准备篇图解PEAR安装
2011/12/05 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
JavaScript多线程详解
2015/08/12 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
Html5新标签解释及用法
2012/02/17 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
后勤部长岗位职责
2013/12/14 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
MySQL表的增删改查(基础)
2021/04/05 MySQL
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
使用python绘制横竖条形图
2022/04/21 Python