Translate Into English Coffee & Tea
ASP.NET 中的 AJAX ASP.NET 画图全接触 ASP.NET 与 XML 声明式数据绑定 ASP.NET 网页抓取
C# 基础 C# 类教程 C# 加密 ASP.NET 成员资格 非“自动化”处理 Excel
QuickAjax Ajax 完美的语法高亮器 Silverlight Popfly
通栏广告
Charset 和 Encoding 的区别是什么?

在绝大多数情况下,包括某些专业文章中,字符集和编码都统称为编码,这是因为一个字符集往往对应一种编码。但是在程序中,我们来不得半点马虎,我们应该清楚地知道字符集和编码有什么区别。以 ASP.NET 为例,Response.Charset 和 Response.Output.Encoding(只读)中的 Charset 和 Encoding 有什么区别呢?

Charset 是字符集,Encoding 是编码。

  • 字符集即字符的集合,规定了在这些集合里面有哪些字符,每一个字符都有一个编号(一个整数),但这只是编号不是编码。
  • 编码就规定了一个编号如何与二进制交互。

我们大多数人最先接触到的字符集是 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 来保存网页,比如 Visual Web Developer
文章评论
  • 严重错误

    一种是字符集是 GB2312,编码使用 ANSI
    ANSI是很多编码的统称,包括GB2312,Shift-JIS,,BIG5 等等。

    编码(Encoding),是文字的抽象的信息化表示。看不见,摸不着。

    字符集(Charset),是Font中使用的术语,.NET中也叫做GdiCharset,冠以"gdi"三个字,清楚地表明了,字符集,是"显示"的时候使用的。
    我们知道,字体(Font)是“显示”用的。同一个Encoding中的同一个数码,
    在不同的Font的情况下,屏幕上显示的东西是不一样的;
    进一步,同一个Font,比如"宋体",如果更改不同的"Charset",则屏幕上显示的图案也是有一些区别的(区别不大)。

    既然Charset只不过是显示的文字的"外观",那么为什么,Charset通常和某种语言联系在一起呢?这很简单,因为,多种语言的文字之中,存在着外形类似的字符。比如,中文和日文中都有汉字,但是他们的外观可能存在差别,但是它们毕竟是"同一个字",所以在某种Encoding下,比如 GBK, Unicode中,他们是同一个代码。那么,中国和日本的文字"显示外观"的风格差异,就需要用Charset来设置。当然,你更换Font也可以,不过,更换Font,是"大整容手术"
    而更换"Charset"是小整容手术。
    -----------------------------------------
    浏览器中所说的 charset ,实际相当于 encoding+charset.
    可以试一下,修改charset是解决不了大部分乱码问题的。
    (另一方面,一小部分“乱码”,是由于Font的charset设置错误而造成的假象,只要更换Font,或正确设置charset即可。windows系统中有一个bug,就是,仅仅对于static控件,charset为0的时候,系统将认为charset==操作系统语言版本,而不是“区域选项”中设置的“非unicode”语言。这种情况下,只有更换操作系统。不过,用Spy++察看发生“伪乱码”的控件,可以发现,并没有乱码,因为本来就不是乱码。)

标题:必填
内容:
文章信息