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

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

有些时候,可能编码会是这样子的:\u4e2d\u56fd

而我们可以这样来处理:

 string value = "\u4e2d\u56fd";
 Console.WriteLine(Uri.UnescapeDataString(value));//输出:中国

项目开发中经常会有出现乱码的情况,这就是由于两端(服务端、请求端)编解码的方式不一致造成的。比如服务端是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编码,有点绕,能理解不?呵呵)

时间: 2024-09-30 10:55:47

C#关于编码、解码相关问题的相关文章

详解JavaScript中的Url编码/解码,表单提交中网址编码

本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数escape / unescape,encodeURI / decodeURI和 encodeURIComponent / decodeURIComponent. 预备知识 foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/ \_______

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

服务器端获取表单数据的编码解码问题(servlet)

首先需要明确指出的是,这里的服务器是指tomcat. 在页面没有明确指定编码的情况下,客户端通过input标签和字符串向服务器传递两个值param1和param2.如果直接使用request.getParameter()方法来获取值的话,得到的肯定都是乱码,我们需要对其重新进行编码解码,就像下面的代码所示的那样: new String(req.getParameter("param1").getBytes("iso-8859-1"), "gbk"

百度移动版的url编码解码代码

1 var decode = function(m) { 2 try { 3 m = decodeURIComponent(m); 4 } catch(e) {} 5 var s = m.split("%"); 6 if (s.length > 1) { 7 s.shift(); 8 for(var i = 0; i < s.length; i++) { 9 var t = s[i]; 10 t = parseInt(t, 16); 11 t = t + 256; 12 t

Atitit.&#160;二进制数据ascii表示法,与base64编码解码api&#160;设计标准化总结java&#160;php&#160;c#.net

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url unsafe2 1.2. 其他的二进制数据表示法  bin2hex() ,Quoted-printable ,UUencode2 2. Base64常用api2 2.1. ------------解码api2 2.2. decode(String s, OutputStream out)2 2.3. 

使用多字节字符集的跨平台(PC、Android、IOS、WP)编码/解码方法

随着移动端的发展,跨平台已成为通讯架构设计的重要考虑因素,PC.Android.IOS.WP等跨多平台间的数据通讯,必然要解决字符编码/解码的问题. 多字节字符集MBCS不是跨平台的首选字符集,面向跨平台.国际化的推荐字符集肯定是UNICODE. 写VC的人都知道,在以前VC++6.0中默认的字符集是多字节字符集,而VS2005及以后默认的字符集是Unicode,VS2013中默认不再对多字节字符串进行支持. 但对很多较早的服务端项目,依然使用的是多字节字符集,不过使用多字节字符集依然可以实现跨

常见编码解码脚本

在平时我们会遇到各种各样的编码,在这里,我总结了一些常见的编码,并不是很全 尝试着做了个编码解码的汇总,并且写了个脚本出来,由于python功底不是很强,所以可能会有不到之处,还望各位多多指正 附上脚本: 1 #-*-coding:utf-8-*- 2 #author:hell0_w 3 #本人博客:http://hell0w.cnblogs.com/ 4 5 import base64 6 import bubblepy 7 import urllib 8 import quopri 9 im

网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码

网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2--Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec<INBOUND_IN, OUTBOUND_IN>) 覆写编码解码方法. pipeline相当于拦截器.在pipeline中添加MessageToMessageCodec接口的实现类,该接口的实现类中的encode()方法自动将发送的Object对象转换为ByteBuf,decode()方法自动将

JavaEE细节问题03——关于服务器和浏览器的编码解码

Request--对于接受请求: 获取请求中的编码解码问题 : 对于post请求,浏览器会根据当前页面的编码来对字符进行编码, 所以我们 直接采用:  request.setCharacterEncoding("UTF-8"); 对于get请求,浏览器自动对字符进行iso-8859-1编码 所以我们拿到以后就要对其进行iso-8859-1解码,使其成为原本的字节数组,然后再进行utf-8编码          Enumeration<String> enums = requ

自定义协议的编码解码

2015.4.1 wqchen. 转载请注明出处 http://www.cnblogs.com/wqchen/p/4385798.html 本文介绍的是一个自定义协议的编码解码工具的实现. 游戏开发中,前端后端协议一般都会协商定制通信协议的格式,统一格式后用程序脚本对应前端和后端的编程语言,分别生成一份协议的编码和解码方案,便于协议的一致性. 这样的工具有很多,比较出名的是google的protobuf,它可以支持很多种编程语言.我也曾试用过protobuf,看过一点它的实现,protobuf完