简单谈谈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安装问题
Oct 09 PHP
PHP设置图片文件上传大小的具体实现方法
Oct 11 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
PHP echo()函数讲解
Feb 15 PHP
PHP微信网页授权的配置文件操作分析
May 29 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
Mar 09 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旋转图片90度的方法
2013/11/07 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
PHP中SESSION过期设置
2021/03/09 PHP
读jQuery之一(对象的组成)
2011/06/11 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
Python操作Excel之xlsx文件
2017/03/24 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
python中的yield from语法快速学习
2020/11/06 Python
HTML5跳转小程序wx-open-launch-weapp的示例代码
2020/07/16 HTML / CSS
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
质检部岗位职责
2013/11/11 职场文书
商务会议邀请函
2014/01/09 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
社区服务活动报告
2015/02/05 职场文书
大学生实习介绍信
2015/05/05 职场文书
入党群众意见范文
2015/06/02 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书