当前位置: 移动技术网 > IT编程>开发语言>PHP > 简单谈谈php中的unicode和utf8编码

简单谈谈php中的unicode和utf8编码

2019年05月30日  | 移动技术网IT编程  | 我要评论

潍坊国税局网站,口女念什么,叶蓓个人资料

重新认识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);

以上所述就是本文的全部内容了,希望大家能够喜欢。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网