在绝大多数情况下,包括某些专业文章中,字符集和编码都统称为编码,这是因为一个字符集往往对应一种编码。但是在程序中,来不得半点马虎。
Charset 是字符集(在网页设计中, 又叫网页编码),Encoding 是编码(在网页设计中, 又叫文件编码)。
关于编码(Encoding)(在网页设计中, 又叫文件编码)
编码(Encoding)就规定了一个编号如何与二进制交互。主要编码是 ANSI、UNICODE、UTF-8、ASCII 等
关于字符集(Charset)(在网页设计中, 又叫网页编码)
字符集(Charset)即字符的集合,是Font中使用的术语,规定了在这些集合里面有哪些字符,每一个字符都有一个编号(一个整数),但这只是编号不是编码。
字符集(Charset)在.NET中也叫做GdiCharset,冠以"gdi"三个字,清楚地表明了,字符集,是"显示"的时候使用的。字体 (Font)也是“显示”用的。同一个Encoding中的同一个数码,在不同的Font的情况下,屏幕上显示的东西是不一样的。
浏览器中所说的 charset ,实际相当于 encoding+charset。修改charset是解决不了大部分乱码问题的。
(另一方面,一小部分“乱码”,是由于Font的charset设置错误而造成的假象,只要更换Font,或正确设置charset即可。windows 系统中有一个bug,就是,仅仅对于static控件,charset为0的时候,系统将认为charset==操作系统语言版本,而不是“区域选项”中 设置的“非unicode”语言。这种情况下,只有更换操作系统。不过,用Spy++察看发生“伪乱码”的控件,可以发现,并没有乱码,因为本来就不是乱 码。)
大多数人最先接触到的字符集是 1963 年的 ASCII,其中的每一个字符只需要用一个字节来表示就可以了。但世界上有许多种语言,像亚洲文字,比如中文,常用汉字就几千个,仅用一个字节来表示显然是不够的,假如使用两个字节。那么问题就来了,为什么要把两个字节看成是一个汉字的编号呢?为什么不把两个字节看成 ASCII 字符集的两个编号呢?为了解决此问题,就得使用编码来标识。
还有一个问题,编号(整数)1234 在字符集 A 中代表“千”,1234 在字符集 B 中代表“一”,那么 1234 究竟代表什么字呢?这就得明确字符集。
浏览器可以自动识别使用哪个字符集,一般说来它们使用 HTTP 头部的 Content-Type 标明的字符集,如果没有向 HTTP 头部发送该信息,一般参考使用 HTML 的 head 标签中的 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />,为什么是参考使用呢?
因为现在浏览器都比较聪明,如果发现这里用错了,一般会给予纠正。
做网页时,如果指定的 Charset 是 GB2312,那么就不应该在网页中出现繁体字,因为 GB2312 标准只有几千个简体的中文字。如果网页编码是 UTF-8,就不要指定字符集是 GB2312,因为虽然 UTF-8 编码对应的 UTF-8 字符集包含了 GB2312 的字符,但同一个字符在两个字符集中的编号不一样。
对于我们中文简体网页,一般来说有两种搭配
* 一种是字符集是 GB2312,编码使用 ANSI。占用磁盘空间最少,网络传输效率最高。
* 一种是字符集是 UTF-8,编码使用 UTF-8。虽然占用磁盘空间大,传输效率略低,但因为兼容面广,在应用 Ajax 以及包含多种语言文字时使用方便。鉴于此原因,现在许多网页开发工具都默认使用 UTF-8 来保存网页。
额外问题
有个很奇怪的现象,在Dreamweaver编写代码时,第一次保存页面时,无论charset用什么编码,页面的中文都不会显示成乱码,但是当第一次保存了页面后,把charset的编码改为其它类型(假如原本是gb2312,现在改成UTF-8),网页的中文就会显示成乱码。
分析原因,大概如下:
Dreamweaver第一次保存页面时,应该是先分析charset,并且根据charset的字符编码类型将文本文件的类型转换成和charset一样的的字符编码,所以在第一次保存页面时,无论charset用什么编码,页面的中文都不会显示成乱码。但是在第一次保存了页面后,Dreamweaver就不会再做这样的工作了,所以把charset的编码改为其它类型时,中文就会显示成乱码的现象。