谈谈字符集编码及gb2312、utf-8编码原理
一、基础中的基础
比特位即bit,是计算机最小的存储单位。以0或1来表示比特位的值。 Byte是字节数,bit是位数,在计算机中每八位为一字节,也就是1Byte=8bit; Byte和bit都翻译成比特,俗称大B(Byte)和小b(bit)
二、GB2312
从GB2312-1980编码开始,汉字都是采用双字节编码。为了与系统中基本的ASCII字符集区分开,所有汉字编码的每个字节的第一位都是1。例如:“啊”字的编码为0xB0A1。(二进制:10110000 10100001) GB2312的汉字编码规则为:第一个字节的值在0xB0到0xF7之间,第二个字节的值在0xA0到0xFE之间。
三、GBK
GB12345和GB13000是对GB2312-1980的扩充,所有已经包含在GB2312中的汉字编码不变,另外增加更多的码位。其编码规则大致为:第一个字节的值在0×81到0xFE之间,第二个字节的值在0×40到0xFE之间。由于GB13000是对GB2312的扩展,所以也被成为GBK。
四、UTF-8
UTF-8编码是一种目前广泛应用于网页的编码,它其实是一种Unicode编码,即致力于把全球所有语言纳入一个统一的编码。
UTF-8用来存储字符串所对应的Unicode的码点,在UTF-8中,0-127之间的码字都使用一个字节来存储,超过128的码字使用2,3甚至6个字节来存储。
所以UTF-8并不是我们所习惯认为的,一个中文两个字节,在UTF-8中,中文一般占三个字节,对于特殊字符可能占更多的字节。
关于Unicode编码的相关知识,请搜索阅读《每个程序员都绝对必须知道的关于字符集和Unicode的那点儿事(别找借口!)》这篇文章
Unicode官网:http://www.unicode.org/
PHP中unicode编码演示:
<?php
@Header('Content-Type:text/html;charset=utf-8');
$res = array('msg'=>'欢迎光临');
$res = json_encode($res);
echo $res;
?>
运行后结果:
{"msg":"\u6b22\u8fce\u5149\u4e34"}
\u代表的是unicode,后面的数字为16进制,6b22代表汉字:欢(1101011 100010)
五、网页中的字符集申明
html:
<meta http-equiv="Conent-Type" content="text/html" charset="utf-8">
PHP:
@Header('Content-Type:text/html;charset=utf-8');
六、PHP中的字符集转换
前提是PHP环境要提供iconv支持。
iconv("GB2312", "UTF-8",$str);
七、GB2312 Unicode转换表
http://bbs.ednchina.com/BLOG_ARTICLE_146899.HTM
最后修改时间:2014年9月9日星期二晚上7点04