编码、解码技术是我们在程序中开发中经常使用到的,对一些敏感信息的存储,比如密码之类的,我们一般是不会直接以明文直接存储到数据库的,而是会通过各种算法,可以是现成的MD5(一种散列算法)、或者是Hash算法+Salt(混淆因子),甚至是自己定义的一套算法进行加解密。这里不想阐述加解密技术,在之前的一篇博客当中,简单列举了两种基本方法,见.NET加解密技术。这里重点讲解一下编码、解码以及乱码的相关问题。
我们先看一个简单的例子:
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的问题。代码如下:
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开发编解码当中会用到。
比如:
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编码,有点绕,能理解不?呵呵)
原帖见:图片webservice传输编码问题。
分享到:
相关推荐
C# Encoder 与 Decoder的例子,详细注释。 Encoder Decoder 编码 解码 C# Encoder Decoder 编码 解码 C# Encoder Decoder 编码 解码 C# Encoder Decoder 编码 解码 C#
C#二维码编码解码器源码
//编码范例: Vec2 v1 = new Vec2(); v1.x = 1.23f; v1.y = 4.56f; string jsonCode = JSON.Encode(v1); Console.WriteLine("jsonCode=" + jsonCode); //jsonCode 为格式化好的JSON字符串: { "x":1.23, "y":4.56 ...
在csdn下载的qrcode,在vs2010下编译总是有错,于是我重新封装了一下,win7+vs2010下测试通过。生成的二维码图片使用iphone4的识别软件准确无误,放上源代码,大家一起研究一下。
霍夫曼编码欢迎下载简简单单自己比较喜欢经验证可以验证,有什么不足欢迎交流
C#哈夫曼树编码/解码程序,以前做的,有点乱。。。
C#实现Base64编码与解码 当我们打开邮件文件时.看到的乱码即为Base64 编码. 此处实现邮件解码 及 邮件编码.
{* DELPHI、PHP、C#通用DES编码解码单元 *} {* 由TurboPower LockBox部分代码改写 *} {* 滕州市东鸣软件工作室制作 ZWF 2011-12-27 *} {*********************************************************} {EncryDes为...
C#H264格式视频解码, 使用FFMPEG解码为H264视频文件,解码后的数据保存为.YUV,可以使用VLC等播放器播放。
对Http URL编码的示例,各种解码方式Demo
c# 2005 PDU短信解码编码 (带例子)
MediaElement C#解码(h.264和aac)FLV MP4 源码,可以编译成功并且成功运行。代码结构清晰,容易移植,比如移植到windows phone上。
用C#实现的条形码和二维码编码解码器,.winform项目中添加对zxing项目的引用. 大家都知道现在QR码越来越好看了,可以给里面加入各种图案和图像。QRcode采用里德-所罗门码来进行编码,里德-所罗门码是一种带有容错机制...
很好用的PDU短消息解码编码类库,附带例子
用c#实现的条形码二维码编码解码器, 可实现通用的条形码EAN-8、EAN-13编码解码 可实现QRcode二维码的编码解码,支持中文哦。
C#开发的Base64编码和解码软件及源码,以后还会继续上传更多的源码,希望能和大家多多交流,共同进步!
在C#程序中生成和读取二维码主要有ThoughtWorks.QRCode和Zxing两种解决方案。个人体验认为,ThoughtWorks.QRCode的编码功能完善,使用灵活,但解码会发生乱码,由于缺少文档,一时找不到解决的办法;而Zxing的解码...
C# 类库来实现MIME的编码和解码 MimeMessage mail new MimeMessage ; mail SetDate ; mail Setversion ; mail SetFrom "sender@local com" null ; mail SetTo "recipient1@server1 com Nick Name...
.net C#实现Base64编码与解码
C#写的二维码编码类和二维码解码类,不调用任何控件,方便翻译成任何语言,可在任意平台上运行。 内有说明文档,说明怎样设置和调用,使用非常的方便,编码一个类,解码一个类,不像网上搜索的那些各种复杂不好用,...