Codepage vs Charset

本文探讨了codepage和charset在web开发中的区别,特别是在ASP.NET中的应用。codepage主要在服务器端影响字符编码,而charset则在浏览器端决定页面显示的字符集。不匹配的codepage和charset会导致乱码,理解两者关系对避免此类问题至关重要。
摘要由CSDN通过智能技术生成

之前在面试话题中介绍了如何言简意赅的回答各种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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值