很多朋友可能没有意识到这个问题,但如果你的网站经常出现莫名其妙的乱码,那么就应该好好地来看看这个话题。
codepage,中文翻译为 “内码表”或者“代码页”,它的完整介绍可以参考下面的链接
http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E9%A1%B5
简单地说,这是程序用于对字符进行编码的一个表。代码页是服务器的事情,或者说是程序的事情。与客户端没有关系。
常见的三种codepage我们是必须知道的
- 简体中文 : 936
- 繁体中文 : 950
- UTF-8 : 65001
我们以前写ASP程序的时候,通常都需要明确指定codepage的,大致下面这样的语法
<%&#64; codepage&#61;936%>简体中文
<%&#64; codepage&#61;950%>繁体中文
<%&#64; codepage&#61;65001%>UTF-8
这样实际上是指定当前页面的字符按照特定的代码页进行编码
这些代码对于有些比较年轻的朋友来说&#xff0c;可能根本没有接触过。毕竟&#xff0c;在ASP.NET里面&#xff0c;你一般不需要进行设置。
<%&#64; Page Language&#61;"C#" AutoEventWireup&#61;"true" CodeBehind&#61;"Default.aspx.cs" Inherits&#61;"WebApplication1._Default"%>
这是一个简单的页面&#xff0c;我们在其中并没有看到有关代码页的设置。那么&#xff0c;如果没有做设置&#xff0c;会用什么设置呢&#xff1f;
答案是&#xff1a;ASP.NET将默认使用UTF -8 进行编码。这也是为什么现在的网页很少发生乱码的原因。
怎么看这个默认的代码页设置呢&#xff1f;很简单&#xff0c;我们通过下面的代码就可以看到
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("当前的代码页设置为:"&#43;Session.CodePage.ToString());
}
}
}
大家可以看到&#xff0c;默认的codepage是65001
与此同时&#xff0c;如果你不想用默认的UTF-8&#xff08;我认为基本上这是不可能的&#xff09;&#xff0c;你仍然可以修改该设置
- 直接在页面中修改
- <%&#64; Page Language&#61;"C#" AutoEventWireup&#61;"true" CodeBehind&#61;"Default.aspx.cs" Inherits&#61;"WebApplication1._Default" CodePage&#61;"936"%>
- 在代码中修改
- Session.CodePage &#61; 936;//这句代码修改代码页为简体中文
- Session.CodePage &#61; 936;//这句代码修改代码页为简体中文
我们可以来测试一下为什么会发生乱码。假设&#xff0c;我们强制给代码页设置为950&#xff08;也就是繁体中文&#xff09;&#xff0c;但是在response里面&#xff0c;我们又输出了简体中文字。那么该页面看起来就像下面这样
传说中的乱码&#xff0c;对吧&#xff1f;
好了&#xff0c;我们大致介绍了codepage的概念&#xff1a;简单地说&#xff0c;它是程序对字符进行编码的依据。
那么&#xff0c;什么是charset呢&#xff1f;
charset&#xff0c;中文翻译为“字符集”&#xff0c;这是指浏览器对收到的字符进行解码所用的字符表。浏览器一般都会自动地根据response中的元数据&#xff0c;选择相应的字符集。如果浏览器的字符集与服务器指定的代码页不匹配&#xff0c;那么很自然可能又产生乱码。
怎么看response中的charset信息&#xff1f;
怎么调整浏览器的字符器设置呢&#xff1f;虽然一般都是自动的&#xff0c;但仍然可以更改
所以&#xff0c;我们到这里就明白了&#xff0c;codepage是服务器端的&#xff0c;charset是浏览器端的。两者必须匹配&#xff0c;才能避免乱码问题。