简单谈谈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实现像JSP,ASP里Application那样的全局变量
Jan 12 PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 PHP
php实现文件下载更能介绍
Nov 23 PHP
php简单的留言板与回复功能具体实现
Feb 19 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
Laravel5中contracts详解
Mar 02 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
Dec 29 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
PDO::rollBack讲解
Jan 29 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语法(1)
2006/10/09 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
10个实用的PHP代码片段
2011/09/02 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python递归实现快速排序
2018/08/18 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Python定时器线程池原理详解
2020/02/26 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
JPA的特点
2014/10/25 面试题
生物制药自我鉴定
2014/01/25 职场文书
联谊会主持词
2014/03/26 职场文书
2014年科室工作总结
2014/11/20 职场文书
公司年夜饭通知
2015/04/25 职场文书