之前在面试话题中介绍了如何言简意赅的回答各种char的使用区别,本文将谈到另外一个高频问题——codepage跟charset的区别和联系。虽然这两个概念几乎天天都会在工作中出现,但就个人过往经验看,面对该问题时能够给出清晰答案的着实凤毛麟角。
首先来看codepage(“内码表”或者“代码页”),这是wiki对他的定义——代码页是字符编码的别名,也称“内码表”,是特定语言的字符集的一张表。(https://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E9%A1%B5)
那么对于字符编码,wiki又是什么如何定义的?字符编码(英语:Characterencoding)、字集码是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。按照惯例,人们认为字符集和字符编码是同义词,因为使用同样的标准来定义提供什么字符并且这些字符如何编码到一系列的代码单元(通常一个字符一个单元)。(https://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81)
搞了半天原来这二者是同义词啊,也就是大名跟小名的关系呗!所以Code Page 936 就是GB2312,Code Page 950 就是BIG5,而Code Page 65001就对应UTF-8。这就破哏了?文章可以结束了吧?如果故事就这么简单,那还真是很傻很天真……
尽管这二者在很多情况下是同义词,但在web开发中两者的作用域还是明显不同的。这里我们将以ASP.NET为技术背景,来进行进一步剖析。首先new一个WebForm工程,在default page中添加如下代码:
namespace CodepageTest
{
public partial class _Default : Page
{
protected void Page_Load(object sender,EventArgs e)
{
Response.Write("Codepage is :" + Session.CodePage.ToString());
}
}
}
启动程序,我们可以看到如下内容。
一切正常!查看header,发现charset已设置为utf-8。
修改代码,添加Session.CodePage = 950; 后再次运行,乱码出现了。
responds header中的charset也随之显示为big5。
到这步已经有人开始提示我说,在浏览中点击查看->编码,然后选择UTF-8不就好了么?OK! 如你所愿。选择完毕后,page显示如下图。
到这里我们其实已经发现,在ASP.NET中codepage的作用域在服务器端,而charset的作用域在浏览器端,两者的最大区别就在于此。同时他们必须匹配,才能有效避免乱码问题的出现,任何一方的单独行动都于事无补。
最后附上codepage和charset的对应关系表,熟记其中的几个常用对应关系,无论对于工作还是面试相信都大有裨益。
CodePage |
CharSet |
Display Name |
37 |
IBM037 |
IBM EBCDIC (US-Canada) |
437 |
IBM437 |
OEM United States |
500 |
IBM500 |
IBM EBCDIC (International) |
708 |
ASMO-708 |
Arabic (ASMO 708) |
720 |
DOS-720 |
Arabic (DOS) |
737 |
ibm737 |
Greek (DOS) |
775 |
ibm775 |
Baltic (DOS) |
850 |
ibm850 |
Western European (DOS) |
852 |
ibm852 |
Central European (DOS) |
855 |
IBM855 |
OEM Cyrillic |
857 |
ibm857 |
Turkish (DOS) |
858 |
IBM00858 |
OEM Multilingual Latin I |
860 |
IBM860 |
Portuguese (DOS) |
861 |
ibm861 |
Icelandic (DOS) |
862 |
DOS-862 |
Hebrew (DOS) |
863 |
IBM863 |
French Canadian (DOS) |
864 |
IBM864 |
Arabic (864) |
865 |
IBM865 |