您的位置:首页 > 编程语言 > ASP

ASP.NET中与编码方式相关的问题

2008-05-08 14:41 351 查看
一.在Asp.net的HttpCookie中写入汉字,读取时为乱码
其实这是因为文字编码而造成的,汉字是两个编码,所以才会搞出这么个乱码出来!其实解决的方法很简单:只要在写入Cookie时,先将其用Url编码,然后再写入,当我们读取时再解码就OK了.

  例子:
  Cookie的写入:
   HttpCookie cookie=new HttpCookie("Simple");
   cookie.Values.Add("Simple1",HttpUtility.UrlEncode("中文字符测试!"));
   cookie.Values.Add("Simple2","The English Charactor Test!");
   Response.AppendCookie(cookie);
  Cookie的读取:
   HttpCookie cookie=Request.Cookies["Simple"];
   string simple1=HttpUtility.UrlDecode(cookie["Simple1"]);
   string simple2=cookie["Simple2"];
  
  这样
  simple1="中文字符测试!";
  simple2="The English Charactor Test!";

二.地址栏中传递带中文字符的参数

传递参数时先将其进行urlencode编码,然后再赋给URL连接,避免获取中文参数时,取出乱码的问题;
例子:
string Text = "地址栏中传递带中文字符的参数"
Text = System.Web.HttpUtility.UrlEncode(Text, System.Text.Encoding.GetEncoding("GB2312"));

三.导出EXCEL时与编码相关的问题
......

四.把UTF-8编码转换为GB2312编码

最近在做的广告系统中,碰到了一个问题,广告系统采用的UTF-8编码,而一些使用这套广告系统的频道页面使用的是GB2312编码。当然也有使用UTF-8编码的频道使用这套广告系统。

频道页面是通过嵌入类似如下的代码方式,来调用广告的。具体那个时间显示那个广告,或者那些广告组合是广告系统自己处理的。

<script type="text/javascript">
<!--
csdn_AD_Position_GroupID = "{f05ff3bf-246b-4d71-a101-b5d4ee3f6cd3}";
csdn_AD_Page_Url = document.location;
//-->
</script>
<script type="text/javascript" src=http://ads.csdn.net/AD/Show_js_AD.js >
</script>

不同编码的页面、脚本之间互相引用,就会产生乱码的问题,解决方法就是统一成一种编码。
asp.net 中,如果要修改输出页面的编码,可以通过修改web.config中以下配置信息

<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

以上只是修改整体的默认编码,如果只有某个页的编码需要修改,ASP.net 中则可以简单的使用下面代码:


Encoding gb2312 = Encoding.GetEncoding("gb2312");


Response.ContentEncoding = gb2312;

在非ASP.net 应用中,可能你读到的数据是UTF-8编码,但是你要转换为GB2312编码,则可以参考以下代码:


string utfinfo = "document.write(/"alert('aa你好么??');/");";


string gb2312info = string.Empty;




Encoding utf8 = Encoding.UTF8;


Encoding gb2312 = Encoding.GetEncoding("gb2312");




// Convert the string into a byte[].


byte[] unicodeBytes = utf8.GetBytes(utfinfo);


// Perform the conversion from one encoding to the other.


byte[] asciiBytes = Encoding.Convert(utf8, gb2312, unicodeBytes);




// Convert the new byte[] into a char[] and then into a string.


// This is a slightly different approach to converting to illustrate


// the use of GetCharCount/GetChars.


char[] asciiChars = new char[gb2312.GetCharCount(asciiBytes, 0, asciiBytes.Length)];


gb2312.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);


gb2312info = new string(asciiChars);


当然,其他各种编码之间的转换,跟上述代码也类似的,就不描述了。

五.ASP.NET自动识别GB2312与UTF-8编码的文件
http://www.webjx.com 更新日期:2007-10-15 22:27 出处:网页教学网

Question

在简体中文系统中,我们有时候需要打开一个保存在磁盘上的纯文本文件,例如txt,但却不知道其保存编码,该怎么办呢?

如果文本只需要在Windows上显示,那就很幸运了,因为无论是GB2312还是UTF-8编码的string都能够正确显示。但如果需要输出到ASP.NET页面上就不是那么简单了,因为如果页面编码为UTF-8但纯文本文件导入的string是GB2312,那就会导致乱码,反之亦然。因此,我们需要一种方法自动识别磁盘上的纯文本文件到底是么编码的。

Answer

StreamReader其实是有编码自动检测功能,不过因为它仅仅检测前3个字节,所以只能UTF-8、Little-Endian Unicode、Big-Endian Unicode之前作出选择,如果上述3个都不匹配,就选择用户提供的编码。因此,我们可以提供GB2312编码给StreamReader,让它在GB2312和UTF-8之前自动作出选择。

using (StreamReader reader = new StreamReader(path, Encoding.Default)
{
string line;
while ((line = reader.ReadLine()) != null)
{
FileTextBox.InnerHtml += Server.HtmlEncode(line) + " ";
}
FileEncodingNameLabel.Text = reader.CurrentEncoding.EncodingName;
}

上述代码使用Encoding.Default初始化StreamReader,Encoding.Default指的是系统的默认ANSI编码,在简体中文系统中就是GB2312。这样写能够让代码保持有一定的兼容性,例如在繁体中文系统就变成了自动在Big5和UTF-8之间做出选择。之后的代码就是用StreamReader逐行读取文件内容并放到FileTextBox中,最后通过StreamReader的CurrentEncoding属性获取编码名称并显示在FileEncodingNameLabel中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: