二分之一

Just Jason's Blog

谈谈字符集编码及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