首页 >后端开发 >php教程 >重新认识unicode跟utf8编码

重新认识unicode跟utf8编码

WBOY
WBOY原创
2016-06-13 12:20:24958浏览

重新认识unicode和utf8编码

重新认识unicode和utf8编码


直到今天,准确的说是刚才,我才知道UTF-8编码和Unicode编码是不一样的,是有区别的
他们之间是有一定的联系的,看看他们的区别:

<code>UTF-8的长度是不一定的,有可能是1、2、3字节Unicode长度一定,2个字节(USC-2)UTF-8可以和Unicode互相转换</code>

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编码,看看下面几个例子:
重新认识unicode跟utf8编码
上面图片中的文字编码格式为UTF-8,可以用WinHex看到其16进制表示

<code>字符	=> 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</code>
再看看从Unicode到UTF-8的转换
<code>5B57获取5B57所在的Unicode范围,0800 </code>

说说问题


再说说今天这个问题的起因,从前端输入很多单词,UTF-8格式每个词最多30个字节,因此会在前端和后台分别做验证,javascript用的是Unicode编码,后端程序用的是UTF-8编码,现在的解决办法是这样

前端
<code>function utf8_bytes(str){	var len = 0, unicode;	for(var i = 0; i </code>
后台
<code>#对于GBK字符串$len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);#对于UTF8字符串$len = ceil(strlen(bin2hex($word))/2);</code>

5/21/2015 8:21:53 PM

本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

4楼清香白莲素还真
Unicode是字符集,定义每个字符对应的数字。,UTF-8、UTF-16等是编码格式,定义“字符对应的数字”如何以二进制的方式存储。
Re: 奔跑的Man
@清香白莲素还真,我觉得这样说更好点:,Uincode定义每个数字(0x0000~0xFFFF)对应的字符,,UTF-8是定义字符对应的数字(不是所有的数字都有对应的字符),,完了之后他们之间有个映射关系
3楼穆恩
第一段有错别字
Re: 奔跑的Man
@穆恩,已改,太粗心了,这里检讨下,谢谢提醒
2楼小丸
博主所说的Unicode其实是utf-16
1楼upfriend
以前也没怎么注意这个问题,因为一般情况下我都让前后端编码统一,不过博主分析的挺好,赞!
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn