您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

重新认识unicode和utf8编码

2024/3/20 9:17:21发布38次查看
重新认识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
说说问题再说说今天这个问题的起因,从前端输入很多单词,utf-8格式每个词最多30个字节,因此会在前端和后台分别做验证,javascript用的是unicode编码,后端程序用的是utf-8编码,现在的解决办法是这样
前端function utf8_bytes(str){ var len = 0, unicode; for(var i = 0; i
后台#对于gbk字符串$len = ceil(strlen(bin2hex(iconv('gbk', 'utf-8', $word)))/2);#对于utf8字符串$len = ceil(strlen(bin2hex($word))/2);
5/21/2015 8:21:53 pm
本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
以上就介绍了重新认识unicode和utf8编码,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product