【C#关于编码那点事】

来源:互联网 发布:2017淘宝打假店铺名单 编辑:程序博客网 时间:2024/04/30 02:20

在开发过程中,往往会遇到很多关于字符串编码的一些问题。

如说乱码呀,在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)        {            //1.字符串编码转换            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("=================================");            //2.html转码            testStr = "测试字符串,a<dl></dl>% ";            Console.WriteLine(testStr);            testStr=HtmlEncode(testStr);            Console.WriteLine("HtmlEncode编码:" + testStr);            testStr = HtmlDecode(testStr);            Console.WriteLine("HtmlDecode解码:" + testStr);            Console.WriteLine("=================================");            //3.Url转码,对#处理有问题            //使用HttpUtility.UrlEncode对传参进行编码,使用HttpUtility.UrlDecode对传参进行解码,貌似十分正常。            //但HttpUtility.UrlEncode和HttpUtility.UrlDecode的搭配对"+"处理混乱:            //HttpUtility.UrlEncode: +变为+            //对于有些情况下,+已经事先变为+,而此时再用HttpUtility.UrlDecode,+会变成空格。            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("=================================");            //4.Base64转码            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("=================================");            //5.Uri.EscapeDataString()            testStr = "http://www.baidu.com?username=<find>&content=ab# c哈哈哈";            Console.WriteLine(testStr);            testStr= Uri.EscapeDataString(testStr);            Console.WriteLine(testStr);        }                /// <summary>        /// 字符串编码转换        /// </summary>        /// <param name="srcEncoding">原编码</param>        /// <param name="dstEncoding">目标编码</param>        /// <param name="srcBytes">原字符串</param>        /// <returns>字符串</returns>        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);        }        /// <summary>        /// 2.html转码        /// </summary>        /// <param name="html"></param>        /// <returns></returns>        static string HtmlEncode(string html)        {            return HttpUtility.HtmlEncode(html); //System.Net.WebUtility.HtmlEncode(html);                    }        /// <summary>        /// 2.html解码        /// </summary>        /// <param name="html"></param>        /// <returns></returns>        public static string HtmlDecode(string html)        {            return HttpUtility.HtmlDecode(html);//System.Net.WebUtility.HtmlDecode(html);          }        /// <summary>        /// 3.Url转码        /// </summary>        /// <param name="url"></param>        /// <returns></returns>        public static string UrlEncode(string url)        {            return HttpUtility.UrlEncode(url);        }        /// <summary>        /// 3.Url解码        /// </summary>        /// <param name="url"></param>        /// <returns></returns>        public static string UrlDecode(string url)        {            return HttpUtility.UrlDecode(url);        }        /// <summary>        /// 4.Base64转码        /// </summary>        /// <param name="input"></param>        /// <returns></returns>        public static string ToBase64(Encoding encod,string input)        {            byte[] bytes = encod.GetBytes(input);            return Convert.ToBase64String(bytes);        }        /// <summary>        /// 4.Base64字符串解码        /// </summary>        /// <param name="input"></param>        /// <returns></returns>        public static string FromBase64(Encoding encod,string input)        {            byte[] bytes = Convert.FromBase64String(input);            return encod.GetString(bytes);        }    }}

在开发过程中,出现编码后乱码的情况,要沉着冷静,从编码的出发点以及实际字符传递的过程中去发现问题。这样才能避免解码出现乱码的情况。


1 0
原创粉丝点击