简单谈谈php中的unicode和utf8编码
发布:smiling 来源: PHP粉丝网 添加日期:2021-05-28 10:01:58 浏览: 评论:0
本文给大家深入讨论了unicode和utf8这两种编码的关系,理解好了会发现网上一些旧的东西,是严重多余兼过期的,因为从utf-8流行开始到现在,早已经由原来六字节可变编码到实际完全居于unicode(UCS-2)的稳定阶段。
重新认识unicode和utf8编码
直到今天,准确的说是刚才,我才知道UTF-8编码和Unicode编码是不一样的,是有区别的囧
他们之间是有一定的联系的,看看他们的区别:
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编码,看看下面几个例子:
上面图片中的文字编码格式为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);
Tags: unicode utf8
- 上一篇:php使用for语句输出三角形的方法
- 下一篇:PHP滚动日志的代码实现
相关文章
- ·汉字转换成Unicode编码PHP程序(2014-07-29)
- ·php5.4中JSON_UNESCAPED_UNICODE让Json更懂中文(2014-09-12)
- ·php怎么把unicode编码转为utf-8编码(2015-04-08)
- ·php的json_encode不支持JSON_UNESCAPED_UNICODE解决办法(2015-12-10)
- ·php中把unicode编码转化为中文(2015-12-24)
- ·PHP Unicode编码相互转换的例子(2016-01-28)
- ·Json_encode防止汉字转义成unicode的方法(2019-12-04)
- ·PHP学习之unicode与普通字符串的如何相互转化(2020-03-28)
- ·PHP解码unicode编码的中文字符代码分享(2021-03-30)
- ·PHP解密Unicode及Escape加密字符串(2021-05-27)
- ·Json_encode防止汉字转义成unicode的方法(2021-07-11)
- ·php utf8编码上传中文文件名出现乱码(2013-12-03)
- ·php中UTF8编码页面iconv转码失败(2013-12-04)
- ·PHP中UTF8中文字符截断程序代码(2014-07-31)
- ·php fopen创建utf8编码文件例子(2014-09-21)
- ·php获取utf8字符串的字符长度实例(2014-09-22)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)