简单谈谈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 相关文章推荐
header()函数使用说明
Nov 23 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
深入PHP autoload机制的详解
Jun 09 PHP
php增删改查示例自己写的demo
Sep 04 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
Nov 13 PHP
php生成html文件方法总结
Dec 01 PHP
Thinkphp无限级分类代码
Nov 11 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 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 启动报错如何解决
2014/01/17 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
Python实现命令行通讯录实例教程
2016/08/18 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
美国玩具公司:U.S.Toy
2018/05/19 全球购物
优秀体育委员自荐书
2014/01/31 职场文书
元旦寄语大全
2014/04/10 职场文书
市场拓展计划书
2014/05/03 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
财务稽核岗位职责
2015/04/13 职场文书
春风化雨观后感
2015/06/11 职场文书