菜单

CodePage、ContentEncoding、Charset、ContentType、meta charset 有什么区别?

2020年1月22日 - 金沙国际唯一官网

CodePage

引言:
前几天 在做web项目的时候 需要导出页面上的数据 到Excel里面
但有的时候出现乱码(有de时候不出现 很奇怪)
原来的代码是这样的:
金沙国际棋牌下载官网,        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader(“content-disposition”,
        “attachment;filename=FileName.xls”);
        HttpContext.Current.Response.Charset = “GB2312”;
        HttpContext.Current.Response.ContentEncoding =
System.Text.Encoding.GetEncoding(“GB2312”);//.Unicode;//.UTF8;//
        HttpContext.Current.Response.ContentType = “xls”;
//”application/vnd.xls”;
        System.IO.StringWriter stringWrite = new
System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new
HtmlTextWriter(stringWrite);
        mygridview.RenderControl(htw);
        HttpContext.Current.Response.Write(sw.ToString());
        HttpContext.Current.Response.End();

很多朋友可能没有意识到这个问题,但如果你的网站经常出现莫名其妙的乱码,那么就应该好好地来看看这个话题。

ASP 中:
<%@ codepage=936%>简体中文
<%@ codepage=950%>繁体中文
<%@ codepage=65001%>UTF-8

如何解决?

金沙国际唯一官网,codepage,中文翻译为 “内码表”或者“代码页”,它的完整介绍可以参考下面的链接

ASP.NET 中示例:
<%@ Page CodePage=936 %>

修改为下面的代码 问题就解决了

CodePage 告诉 IIS 按什么编码来读取
QueryString,按什么编码转换数据库中的内容……

        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.Write(“<meta
http-equiv=Content-Type;
content=text/html;charset=gb2312>”);            
        HttpContext.Current.Response.AddHeader(“content-disposition”,
“attachment; filename=MyExcelFile.xls”);
        HttpContext.Current.Response.ContentEncoding =
System.Text.Encoding.GetEncoding(“GB2312”);
        HttpContext.Current.Response.ContentType =
“application/excel”;
        System.IO.StringWriter sw = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htw = new
System.Web.UI.HtmlTextWriter(sw);
        mygridview.RenderControl(htw);
        HttpContext.Current.Response.Write(sw.ToString());
        HttpContext.Current.Response.End();

简单地说,这是程序用于对字符进行编码的一个表。代码页是服务器的事情,或者说是程序的事情。与客户端没有关系。

Response.ContentEncoding

仔细比较一下 就是

常见的三种codepage我们是必须知道的

获取或设置输出流的 HTTP 字符集。

       HttpContext.Current.Response.Write(“<meta
http-equiv=Content-Type; content=text/html;charset=gb2312>”); 
      这句话起的作用 (这句话的作用是声明该网页使用gb2312进行编码)
      原来是 HttpContext.Current.Response.Charset = “GB2312”;
      我以为有这句话 就可以  看来不行
      还是 使用 <meta http-equiv=Content-Type;
content=text/html;charset=gb2312> 比较保险

Response.Charset

我们以前写ASP程序的时候,通常都需要明确指定codepage的,大致下面这样的语法

获取或设置输出流的 HTTP 字符集。微软对 ContentEncoding、Charset
的解释是一字不差,其实可以这样理解:ContentEncoding
是标识这个内容是什么编码的,而 Charset 是告诉客户端怎么显示的。

<%@ codepage=936%>简体中文
<%@ codepage=950%>繁体中文
<%@ codepage=65001%>UTF-8

我们可以做一个实验来理解:

这样实际上是指定当前页面的字符按照特定的代码页进行编码

Response.ContentEncoding = System.Text.Encoding.GetEncoding(“gb2312”);
Response.Charset = “utf-8”;
Response.Write(“千一网络”);

这些代码对于有些比较年轻的朋友来说,可能根本没有接触过。毕竟,在ASP.NET里面,你一般不需要进行设置。

然后用浏览器打开网页,可以发现是乱码,可是用记事本查看源文件,又发现不是乱码。这就说明了:ContentEncoding
是管字节流到文本的,而 Charset 是管在浏览器中显示的。再继续观察:

<%@ Page Language=”C#” AutoEventWireup=”true”
CodeBehind=”Default.aspx.cs” Inherits=”WebApplication1._Default”%>

Response.ContentEncoding = System.Text.Encoding.GetEncoding(“gb2312”);

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“>

通过
Fidller,发现
HTTP 头中是:text/html; charset=gb2312。说明没有指定 Charset
时,就用 ContentEncoding 的 Charset 作为 charset。

<html xmlns=” >
<head runat=”server”>
    <title></title>
</head>
<body>
    <form id=”form1″ runat=”server”>
    <div>
    </div>
    </form>
</body>
</html>

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图