《PHP实例:简单谈谈php中的unicode和utf8编码》要点:
本文介绍了PHP实例:简单谈谈php中的unicode和utf8编码,希望对您有用。如果有疑问,可以联系我们。
PHP应用重新认识unicode和utf8编码
PHP应用直到本日,准确的说是刚才,我才知道UTF-8编码和Unicode编码是不一样的,是有区别的
他们之间是有一定的联系的,看看他们的区别:
UTF-8的长度是不一定的,有可能是1、2、3字节
Unicode长度一定,2个字节(USC-2)
UTF-8可以和Unicode互相转换
PHP应用unicode和utf8的关系
PHP应用Unicode(16进制)
PHP应用UTF-8(二进制)
PHP应用0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
PHP应用上面的表格有2个意思,第一个显而易见便是说Unicode和UTF-8字符范围的对应,还有一个可以看出Unicode怎么和UTF-8互相转换:
PHP应用先说UTF-8到Unicode的转换
PHP应用UTF-8编码的二进制和上面的3种格式进行匹配,匹配到之后去掉固定位(表格中的非x位置),然后从右到左每8位一组,不够8位左边不领,凑够2个字节16 bits,这16 bits所表示的便是UTF-8对应的Unicode编码,看看下面几个例子:
PHP应用
PHP应用上面图片中的笔墨编码格式为UTF-8,可以用WinHex看到其16进制表示
PHP应用汉 => E6B189 => 11100110 10110001 10001001 => 01101100 01001001 => 6C49
字 => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57
PHP应用#下面是在chrome命令行下面运行的结果
'\u6C49'
"汉"
'\u5B57'
"字"
PHP应用#到这里的话,从UTF-8转换到Unicode已经是一件非常容易的事了,看看转换的伪代码
读取一个字节,11100110
判断该UTF-8字符的格式,属于第三种,3个字节
继续读取2个字节得到 11100101 10101101 10010111
依照格式去掉固定位 1011011 01010111
不够16位,左边补零 01011011 01010111 => 5B57
PHP应用再看看从Unicode到UTF-8的转换
PHP应用说说问题
PHP应用再说说今天这个问题的起因,从前端输入很多单词,UTF-8格式每个词最多30个字节,因此会在前端和后台分别做验证,javascript用的是Unicode编码,后端程序用的是UTF-8编码,现在的解决方法是这样
PHP应用前端
PHP应用
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
PHP应用后台
PHP应用
#对于GBK字符串
$len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);
#对于UTF8字符串
$len = ceil(strlen(bin2hex($word))/2);
PHP应用以上所述便是本文的全部内容了,希望大家能够喜欢.
维易PHP培训学院每天发布《PHP实例:简单谈谈php中的unicode和utf8编码》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。