简单谈谈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 相关文章推荐
杏林同学录(二)
Oct 09 PHP
PHP时间戳使用实例代码
Jun 07 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
Jul 04 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 PHP
从wamp到xampp的升级之路
Apr 08 PHP
php修改上传图片尺寸的方法
Apr 14 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 PHP
如何重写Laravel异常处理类详解
Dec 20 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
用php实现批量查询清除一句话后门的代码
2008/01/20 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
PHP中echo和print的区别
2014/08/28 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python中内置的日志模块logging用法详解
2016/07/12 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
Python页面加载的等待方式总结
2021/02/28 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
考博专家推荐信模板
2013/12/02 职场文书
道路建设实施方案
2014/03/18 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
Python实现生成bmp图像的方法
2021/06/13 Python
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技