天天看点

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

我们先看一个简单的例子:

1

2

3

4

<code>string</code> <code>str = </code><code>"abcd"</code><code>;</code><code>//测试字符串</code>

<code>byte</code><code>[] bytes = Encoding.GetEncoding(</code><code>"ascii"</code><code>).GetBytes(str);</code><code>//将字符串转成ascii编码的字节数组,这里的bytes数组,长度为4,分别对应于abcd的ascii码97、98、99、100</code>

<code>string</code> <code>result = Encoding.GetEncoding(</code><code>"ascii"</code><code>).GetString(bytes);</code><code>//将字节数组转回为字符串</code>

<code>Console.WriteLine(result);</code><code>//输出abcd</code>

这里应用到了ascii编码。我们知道,ascii码是国际标准编码,全称为:美国信息交换标准编码,只能表示127个字符,不能代表汉字,所以我们对汉字进行ascii编码之后,是不能进行还原的。汉字不能转变为ascii码,因此会变成乱码,对乱码进行还原也就还原不了了。

正是由于ascii码的局限性,不能表示世界上各种语言和符号,因此ISO(国际标准化组织)推出了unicode编码,它可以容纳世界上所有的文字和字符。

项目开发中经常会有出现乱码的情况,这就是由于两端(服务端、请求端)编解码的方式不一致造成的。比如服务端是utf-8编码,而在客户端以gbk接收,那么就会出现乱码。所以解决乱码这个问题,思路就是从对方的编码方式入手,弄清楚对方的编码是什么编码,我这边就以什么编码来解码。这个解决问题的思路,在我实际项目开发过程中屡试不爽。

比如我们经常会用到web页面导出excel的问题。代码如下:

5

6

7

<code>string</code> <code>fileName = HttpUtility.UrlEncode(</code><code>"Excel文件名为中文哦.xls"</code><code>);</code>

<code>Response.Clear();</code>

<code>Response.Buffer = </code><code>true</code><code>;</code>

<code>Response.AppendHeader(</code><code>"Content-Disposition"</code><code>, </code><code>"attachment;filename="</code> <code>+ fileName);</code>

<code>Response.ContentEncoding = System.Text.Encoding.UTF8;</code>

<code>Response.ContentType = </code><code>"application/vnd.ms-excel"</code><code>;</code>

<code>this</code><code>.EnableViewState = </code><code>false</code><code>;</code>

经过HttpUtility.UrlEncode方法进行编码之后,在IE浏览器下弹出的excel下载对话框中显示的文件名就不会显示乱码,而显示正常的汉字了。对应的方法是HttpUtility.UrlDecode方法,进行解密。这两个方法在web开发编解码当中会用到。

比如:

<code>string</code> <code>text = </code><code>"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&amp;tn=myie2dg"</code><code>;</code>

<code>string</code> <code>result = HttpUtility.UrlDecode(text, Encoding.GetEncoding(</code><code>"gbk"</code><code>));</code>

<code>Response.Write(result);</code><code>//输出http://www.baidu.com/baidu?word=中国大百科在线全文检索&amp;tn=myie2dg</code>

最后附一个我几年前曾经在实际项目开发中遇到过的一个问题。

当时也是很着急,花了一天时间也没有解决那个问题,老是得不到正确的结果。当时的情况是对方将图片转变为字节数组,然后对这个字节数组进行base64编码之后再对新的字符串进行utf-8编码,最后封装成xml文档。当然这个过程是我推断的,因为当时并不知道真实的情况,只是调用对方提供的webservice。一般来说,对于中文的编码还是以utf-8、gbk、gb2312等编码为主。对方提供的开发文档当中并没有提及编码方式,最后经过实验,用utf-8编码方式解决。(其实准确一点来说,当时的情况是不知道是先对字节数组进行utf-8编码还是先对字节数组的base64编码之后得到的一串字符串再进行utf-8编码,有点绕,能理解不?呵呵)

本文转自 guwei4037  51CTO博客,原文链接:http://blog.51cto.com/csharper/1345982