简单谈谈php中的unicode和utf8编码
《PHP实例:简单谈谈php中的unicode和utf8编码》要点: PHP应用重新认识unicode和utf8编码 直到本日,准确的说是刚才,我才知道UTF-8编码和Unicode编码是不一样的,是有区别的 unicode和utf8的关系 Unicode(16进制) UTF-8(二进制) 0000 - 007F 0xxxxxxx 上面的表格有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 #下面是在chrome命令行下面运行的结果 #到这里的话,从UTF-8转换到Unicode已经是一件非常容易的事了,看看转换的伪代码 再看看从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中的unicode和utf8编码》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |