简单谈谈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 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
一个程序下载的管理程序(四)
Oct 09 PHP
PHP简单系统数据添加以及数据删除模块源文件下载
Jun 07 PHP
ajax实现无刷新分页(php)
Jul 18 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
php smtp实现发送邮件功能
Jun 22 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 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语法速查表
2006/12/06 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
PHP中overload与override的区别
2017/02/13 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Windows下安装Scrapy
2018/10/17 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
django框架forms组件用法实例详解
2019/12/10 Python
Python PyQt5整理介绍
2020/04/01 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
怎样声明接口
2014/09/19 面试题
采购部主管岗位职责
2014/01/01 职场文书
2014新年寄语
2014/01/20 职场文书
淘宝活动策划方案
2014/02/06 职场文书
安全生产月活动总结
2014/05/04 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
结婚主持人致辞
2015/07/28 职场文书