最近做一个小系统,需要url传递中文参数。做完测试的时候,客户对我说,点击分类之后,什么也显示不出来。我说不可能啊,因为我这里显示没问题。后来才发现,原来自己用的是IE7,而客户用的是IE6,我换做IE6测试,果然是这样。
这样我就开始在百度上找啊找,最后找到一个在web.config上设置url参数格式。即在<system.web>下面加上<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" uiCulture="zh-CN" responseHeaderEncoding="gb2312" fileEncoding="gb2312" />
但是,令我失望的是,这样对于传递一个参数还行。在url已经有一个参数的基础上再动态添加参数,就不行了,又出现乱码。
这样,无奈之下,只得用base64编码了。一开始用的一个比较简单的,以前用过的,但是还是会错误。可笑的是,一个“城”字,进行编码,然后进行解码,就会报错。我也不知道为什么,偏偏对这个字特殊优待。
这样我不得不再去百度搜,终于找到另一个别人做好的C#类。很好用,对中文也支持很好,这下总算是大功告成了!!!
最后感叹,中国这样经典的文字,在计算机编程语言里面,却是最最不友好的东西。真难为我们这些中国程序员了。
好了,把那个base64编码的类提供给大家参考
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Cryptography;
?public? class? EnCode
??? {
???????
??????
?????? /// <summary>
??????? /// 将字符串使用base64算法加密
??????? /// </summary>
??????? /// <param name="SourceString">待加密的字符串</param>
??????? /// <param name="Ens">System.Text.Encoding 对象,如创建中文编码集对象:
??????? /// System.Text.Encoding.GetEncoding("gb2312")</param>
??????? /// <returns>编码后的文本字符串</returns>
?????? public static string EncodingString(string SourceString, System.Text.Encoding Ens)
?????? {
?????????? return Convert.ToBase64String(Ens.GetBytes(SourceString));
?????? }
??? /// <summary>
??? /// 使用缺省的代码页将字符串使用base64算法加密
??? /// </summary>
??? /// <param name="SourceString">待加密的字符串</param>
??? /// <returns>加密后的文本字符串</returns>
??? public static string base64Encode(string SourceString)
??? {
??????? return EncodingString(SourceString, System.Text.Encoding.Default);
??? }
??????
??? /// <summary>
??? /// 从base64编码的字符串中还原字符串,支持中文
??? /// </summary>
??? /// <param name="Base64String">Base64加密后的字符串</param>
??? /// <param name="Ens">System.Text.Encoding对象,如创建中文编码集对象:
??? /// System.Text.Encoding.Default</param>
??? /// <returns>还原后的文本字符串</returns>
??? public static string DecodingString(string Base64String, System.Text.Encoding Ens)
??? {
??????? return Ens.GetString((Convert.FromBase64String(Base64String)));
??? }
?
??? /// <summary>
??? ///使用缺省的代码页从Base64编码的字符串中还原字符串,支持中文
??? /// </summary>
??? /// <param name="Base64String">Base64加密后的字符串</param>
??? /// <returns>还原后的文本字符串</returns>
??? public static string base64Decode(string Base64String)
??? {
??????? return DecodingString(Base64String, System.Text.Encoding.Default);
??? }
???
??? /// <summary>
??? /// 对一个文件进行Base64编码,并返回编码后的字符串
??? /// </summary>
??? /// <param name="strFileName">文件的路径和文件名</param>
??? /// <returns>对文件进行Base64编码后的字符串</returns>
??? public static string EncodingFileToString(string strFileName)
??? {
??????? System.IO.FileStream fs = System.IO.File.OpenRead(strFileName);
??????? System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
??????? string Base64String = Convert.ToBase64String(br.ReadBytes((int)fs.Length));
??????? br.Close();
??????? fs.Close();
??????? return Base64String;
??? }
???
??? /// <summary>
??? /// 对一个文件进行Base64编码,并将编码后的内容写入到一个文件
??? /// </summary>
??? /// <param name="strSourceFileName">要编码的文件地址,支持任何类型的文件</param>
??? /// <param name="strSaveFileName">要写入的文件路径</param>
??? /// <returns>如果写入成功,则返回真</returns>