简单谈谈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的聊天室设计
Oct 09 PHP
用php来检测proxy
Oct 09 PHP
一个简单的PHP入门源程序
Oct 09 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
分享一个超好用的php header下载函数
Jan 31 PHP
PHP Session机制简介及用法
Aug 19 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
php字符串分割函数用法实例
Mar 17 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
crontab无法执行php的解决方法
Jan 25 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中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
js变换显示图片的实例
2013/04/16 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
python进阶教程之词典、字典、dict
2014/08/29 Python
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
工作自我评价分享
2013/12/01 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
英语教育专业自荐信
2014/05/29 职场文书
社区志愿者活动总结
2014/06/26 职场文书
个人整改方案范文
2014/10/25 职场文书
python实现简单区块链结构
2021/04/25 Python
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android