C#关于编码、解码相关问题

编码、解码技术是我们在程序中开发中经常使用到的,对一些敏感信息的存储,比如密码之类的,我们一般是不会直接以明文直接存储到数据库的,而是会通过各种算法,可以是现成的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


上一篇:美国博客刊文发布NetApp StoreVault停产通知


下一篇:金蝶BOS开发属性中规则事件