转载连接: http://blog.csdn.net/heyangyi_19940703/article/details/51219893
在开发过程中,往往会遇到很多关于字符串编码的一些问题。
如说乱码呀,在url跳转过程中参数传递不正确,加密的字符串在请求时服务端介绍解码处理异常。
经过RSA签名的数据在请求后服务端接收后,解码处理异常等等的问题。这些都是与我们的字符串编码有问题的。
先归纳一下知识点:
1.字符:
字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等
2.字符集:
是一个系统支持的所有抽象字符的集合,字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
3.字符编码:
字符编码(Character Encoding):简单的说就是建立自然语言与机器语言之间的对应关系。
计算机中的信息包括数据信息和控制信息,数据信息又可分为数值和非数值信息。非数值信息和控制信息包括了字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得以处理,这种对字母和符号进行编码的二进制代码称为字符代码(Character Code)。计算机中常用的字符编码有ASCII码(美国标准信息交换码)和EBCDIC码(扩展的BCD交换码)。
在 ASCII 编码中,一个英文字母字符存储需要1个字节。
在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。
在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。
在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
在UTF-32编码中,世界上任何字符的存储都需要4个字节。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Web;
-
- namespace ConsoleApplication2
- {
- class Program
- {
- static void Main(string[] args)
- {
-
- string testStr = "测试字符串,abcd,1234,!@#¥%……&*()——+";
- Console.WriteLine(testStr);
- string encodStr = TransferEncoding(Encoding.UTF8, Encoding.Default, testStr);
- Console.WriteLine("UTF8编码:" + encodStr);
- encodStr = TransferEncoding(Encoding.Default, Encoding.UTF8, encodStr);
- Console.WriteLine("UTF8解码:" + encodStr);
-
- Console.WriteLine("=================================");
-
-
- testStr = "测试字符串,a<dl></dl>% ";
- Console.WriteLine(testStr);
- testStr=HtmlEncode(testStr);
- Console.WriteLine("HtmlEncode编码:" + testStr);
- testStr = HtmlDecode(testStr);
- Console.WriteLine("HtmlDecode解码:" + testStr);
-
- Console.WriteLine("=================================");
-
-
-
-
-
-
- testStr = "http://www.baidu.com?username=<find>&content=ab# c哈哈哈";
- Console.WriteLine(testStr);
- testStr = UrlEncode(testStr);
- Console.WriteLine("UrlEncode编码:" + testStr);
- testStr = UrlDecode(testStr);
- Console.WriteLine("UrlDecode解码:" + testStr);
-
- Console.WriteLine("=================================");
-
-
- testStr = "Coming from the new world!哈哈哈";
- Console.WriteLine(testStr);
- testStr = ToBase64(Encoding.Default,testStr);
- Console.WriteLine("ToBase64编码:" + testStr);
- testStr = FromBase64(Encoding.Default, testStr);
- Console.WriteLine("FromBase64 解码:" + testStr);
-
- Console.WriteLine("=================================");
-
- testStr = "http://www.baidu.com?username=<find>&content=ab# c哈哈哈";
- Console.WriteLine(testStr);
- testStr= Uri.EscapeDataString(testStr);
- Console.WriteLine(testStr);
- }
-
-
-
-
-
-
-
-
- static string TransferEncoding(Encoding srcEncoding, Encoding dstEncoding, string srcStr)
- {
- byte[] srcBytes = srcEncoding.GetBytes(srcStr);
- byte[] bytes = Encoding.Convert(srcEncoding, dstEncoding, srcBytes);
- return dstEncoding.GetString(bytes);
- }
-
-
-
-
-
-
- static string HtmlEncode(string html)
- {
- return HttpUtility.HtmlEncode(html);
- }
-
-
-
-
-
-
- public static string HtmlDecode(string html)
- {
- return HttpUtility.HtmlDecode(html);
- }
-
-
-
-
-
-
- public static string UrlEncode(string url)
- {
- return HttpUtility.UrlEncode(url);
- }
-
-
-
-
-
-
- public static string UrlDecode(string url)
- {
- return HttpUtility.UrlDecode(url);
- }
-
-
-
-
-
-
- public static string ToBase64(Encoding encod,string input)
- {
- byte[] bytes = encod.GetBytes(input);
- return Convert.ToBase64String(bytes);
- }
-
-
-
-
-
-
- public static string FromBase64(Encoding encod,string input)
- {
- byte[] bytes = Convert.FromBase64String(input);
- return encod.GetString(bytes);
- }
- }
- }
在开发过程中,出现编码后乱码的情况,要沉着冷静,从编码的出发点以及实际字符传递的过程中去发现问题。这样才能避免解码出现乱码的情况。