编码、解码技术是我们在程序中开发中经常使用到的,对一些敏感信息的存储,比如密码之类的,我们一般是不会直接以明文直接存储到数据库的,而是会通过各种算法,可以是现成的MD5(一种散列算法)、或者是Hash算法+Salt(混淆因子),甚至是自己定义的一套算法进行加解密。这里不想阐述加解密技术,在之前的一篇博客当中,简单列举了两种基本方法,见.NET加解密技术。这里重点讲解一下编码、解码以及乱码的相关问题。
我们先看一个简单的例子:
1
2
3
4
|
string str = "abcd" ; //测试字符串
byte [] bytes = Encoding.GetEncoding( "ascii" ).GetBytes(str); //将字符串转成ascii编码的字节数组,这里的bytes数组,长度为4,分别对应于abcd的ascii码97、98、99、100
string result = Encoding.GetEncoding( "ascii" ).GetString(bytes); //将字节数组转回为字符串
Console.WriteLine(result); //输出abcd
|
这里应用到了ascii编码。我们知道,ascii码是国际标准编码,全称为:美国信息交换标准编码,只能表示127个字符,不能代表汉字,所以我们对汉字进行ascii编码之后,是不能进行还原的。汉字不能转变为ascii码,因此会变成乱码,对乱码进行还原也就还原不了了。
正是由于ascii码的局限性,不能表示世界上各种语言和符号,因此ISO(国际标准化组织)推出了unicode编码,它可以容纳世界上所有的文字和字符。
项目开发中经常会有出现乱码的情况,这就是由于两端(服务端、请求端)编解码的方式不一致造成的。比如服务端是utf-8编码,而在客户端以gbk接收,那么就会出现乱码。所以解决乱码这个问题,思路就是从对方的编码方式入手,弄清楚对方的编码是什么编码,我这边就以什么编码来解码。这个解决问题的思路,在我实际项目开发过程中屡试不爽。
比如我们经常会用到web页面导出excel的问题。代码如下:
1
2
3
4
5
6
7
|
string fileName = HttpUtility.UrlEncode( "Excel文件名为中文哦.xls" );
Response.Clear(); Response.Buffer = true ;
Response.AppendHeader( "Content-Disposition" , "attachment;filename=" + fileName);
Response.ContentEncoding = System.Text.Encoding.UTF8; Response.ContentType = "application/vnd.ms-excel" ;
this .EnableViewState = false ;
|
经过HttpUtility.UrlEncode方法进行编码之后,在IE浏览器下弹出的excel下载对话框中显示的文件名就不会显示乱码,而显示正常的汉字了。对应的方法是HttpUtility.UrlDecode方法,进行解密。这两个方法在web开发编解码当中会用到。
比如:
1
2
3
|
string text = "http://www.baidu.com/baidu?word=%D6%D0%B9%FA%B4%F3%B0%D9%BF%C6%D4%DA%CF%DF%C8%AB%CE%C4%BC%EC%CB%F7&tn=myie2dg" ;
string result = HttpUtility.UrlDecode(text, Encoding.GetEncoding( "gbk" ));
Response.Write(result); //输出http://www.baidu.com/baidu?word=中国大百科在线全文检索&tn=myie2dg
|
最后附一个我几年前曾经在实际项目开发中遇到过的一个问题。
当时也是很着急,花了一天时间也没有解决那个问题,老是得不到正确的结果。当时的情况是对方将图片转变为字节数组,然后对这个字节数组进行base64编码之后再对新的字符串进行utf-8编码,最后封装成xml文档。当然这个过程是我推断的,因为当时并不知道真实的情况,只是调用对方提供的webservice。一般来说,对于中文的编码还是以utf-8、gbk、gb2312等编码为主。对方提供的开发文档当中并没有提及编码方式,最后经过实验,用utf-8编码方式解决。(其实准确一点来说,当时的情况是不知道是先对字节数组进行utf-8编码还是先对字节数组的base64编码之后得到的一串字符串再进行utf-8编码,有点绕,能理解不?呵呵)
本文转自 guwei4037 51CTO博客,原文链接:http://blog.51cto.com/csharper/1345982