|
Originally posted by wool王 at 2005-9-21 21:17:
utf8是国际码
看来大家对字符集不是很懂。(在这里我明确区分编码和字符集,因为他们是不同的,虽然我们经常把他们混为一谈)
字符集其实是一种把映射,是文字到二进制数据的映射。
例如:我们熟悉的ascii码,就是
0 -> 0x30
1 -> 0x31
...
的映射。
这里的文字,可以是单个汉字、字母、数字、符号、标点、等等。
下面是几种常见的字符集:
iso-8859-1,其文字范围主要就是我们键盘上所看到的还有部分不可打印的控制字符,二进制范围只用了1个字节,值是十进制的0-255。也叫latin字符集。ascii是它的子集(0-127)。
gb2312,是国标码(比较少的),其文字范围涵盖比较常见的简体字以及标点符号,其二进制采用两个字节,为了与ascii兼容,gb2312码的每个字节十进制值总是大于127,这样就保留了127以下的值区间给ascii字符使用。
gbk码,是在gb2312基础上设计的,比gb2312包含更多字符的字符集,也叫大字符集。
big5码。大5码是港台地区普遍使用的字符集,类似gb2312码,也是采用两个字节,也是与ascii码兼容(每字节都要大于127以保留127以下给ascii使用)。这个字符集的映射与gb2312不同,即假设gb2312“你”的映射使用big5来反映射得到的不是繁体的“妳”,而是另外一个字。
unicode字符集,unicode字符集分为两个标准,一个称为UCS-2,另外一个是UCS-4。前一个是采用两个字节,即16位,后面一个使用了32位4个字节。因而后面的标准可以容纳数百万个文字。目前两个标准的内容是基本一致的,即UCS-2的内容和UCS-4的低两字节一样,UCS-4的高两字节填0,UCS-4庞大的字符集空间做好对未来扩充的准备,但现在使用4字节来存储一个文字显得浪费,因而一般都使用UCS-2标准存储。我们所说的Unicode在没有明确说明情况下也仅指使用2字节的UCS-2。
utf-8,严格来说,这不是一个字符集,而是一个编码。这是一个用于传输unicode字符的编码方案。(也因为其特殊应用,所以这个编码有了唯一的集合,一般都看作字符集)。utf-8这个8是指使用8位的前导.前面说了,127以下的是属于ascii字符集,其实Unicode字符集的0x0000-0x007f与ascii是兼容的。0-127可形容为0x00-0x7f,其最高位(传输使用高位开始传,是最前一位)是0,则代表应当解析为1个字节的ascii字符。如果最前是110xxxxx,则代表组成这个文字值的总共有2个字节,其后面一个字节必须是10xxxxxx的形式,这些x就用Unicode字符集中的值从左到右填充。具体的填充方法(抄来如下):
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
乱码的形成,要让浏览器正确显示网页,主要有两点:
1,网站输出的字符集必须是浏览器所在系统安装有的字符集,如网站输出big5字符集,而我们机子没有安装big5码,则无论如何是显示不正常的。
2,网站数尺的内容,还有浏览器使用正确的字符集解析。这就需要网页制作者在http协议头(header)声明正确的charset,以及在输出的html声明charset(两个地方)。两个charset一致。同时保证网页包含的内容使用的字符集一致,这又与数据库输出的内容相关联,(所以还要保证数据库保存的数据使用与网页一致的字符集)。
如楼主所说,全部使用utf-8是一个解决方法。但却不是最好的方法。为什么?这个问题十分复杂,说起来一大堆。但有一个最简单的常识:我们中国人的操作系统最常用的字符集是gb2312而不是utf-8。 |
|