简单谈谈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 相关文章推荐
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
php zend 相对路径问题
Jan 12 PHP
PHP 文件扩展名 获取函数
Jun 03 PHP
关于php连接mssql:pdo odbc sql server
Jul 20 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP编程实现的TCP服务端和客户端功能示例
Apr 13 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
php封装实现钉钉机器人报警接口的示例代码
Aug 08 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
Nov 27 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
Oracle 常见问题解答
2006/10/09 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
帝国cms目录结构分享
2015/07/06 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
javascript 跳转代码集合
2009/12/03 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
JavaScript中this详解
2015/09/01 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
Python中针对函数处理的特殊方法
2014/03/06 Python
详解K-means算法在Python中的实现
2017/12/05 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
python开发入门——set的使用
2020/09/03 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
部队学习十八大感言
2014/01/11 职场文书
寒假安全保证书
2015/02/28 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL