简单谈谈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_MySQL教程-第一天
Mar 18 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
php class类的用法详细总结
Oct 17 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
PHP递归创建多级目录
Nov 05 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
Symfony控制层深入详解
Mar 17 PHP
php实现微信扫码自动登陆与注册功能
Sep 22 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
May 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调用Oracle存储过程的方法
2008/09/12 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
php使用websocket示例详解
2014/03/12 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
php实现webservice实例
2014/11/06 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
python高阶爬虫实战分析
2018/07/29 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
如何基于python实现脚本加密
2019/12/28 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
党支部创先争优活动总结
2014/08/28 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
医院护士工作检讨书
2014/10/26 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL