简单谈谈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下使用strpos需要注意 === 运算符
Jul 17 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
Thinkphp关闭缓存的方法
Jun 26 PHP
PHP匿名函数和use子句用法实例
Mar 16 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
Feb 15 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
基于laravel where的高级使用方法
Oct 10 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实现选择排序的解决方法
2013/05/04 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
PHP 快速排序算法详解
2014/11/10 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
python实现的一个p2p文件传输实例
2014/06/04 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
使用python绘制温度变化雷达图
2019/10/18 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
python异步Web框架sanic的实现
2020/04/27 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
Python如何获取文件路径/目录
2020/09/22 Python
Python实现壁纸下载与轮换
2020/10/19 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
缓刑人员的思想汇报
2014/01/11 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
法人委托书
2014/07/31 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python