【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); } }}
在开发过程中,出现编码后乱码的情况,要沉着冷静,从编码的出发点以及实际字符传递的过程中去发现问题。这样才能避免解码出现乱码的情况。
- 【C#关于编码那点事】
- 关于系统编码的那点事
- 编码就是那点事
- 编码的那点事
- 网页编码那点事
- 关于C#中数组的那点事!
- 关于C#静态构造函数那点事
- 关于读书那点事
- 关于'愤青'那点事
- 关于tftp那点事
- 关于autoRelease那点事
- 关于iterator那点事
- 关于cell那点事!
- 关于ContextLoaderListener那点事
- 关于JNDI那点事
- 关于需求那点事
- 关于rbac那点事
- 关于UINavgation那点事
- ubuntu下安装opencv过程
- python while循环
- web.xml配置文件总结
- 死亡历险,DELPHI以TByteDynArray(Bytes)方式传递图片到JAVA的WEBSERVICE保存
- c++之精确度
- 【C#关于编码那点事】
- 蓝桥杯星系炸弹C代码实现
- RPM详解
- rabbitmq学习1:hello world
- JS----JS调试技巧
- Google推荐的图片加载库Glide介绍
- OpenCV 3.1.0添加opencv_contrib模块(Windows)
- 欢迎使用CSDN-markdown编辑器
- POSIX 消息队列相关问题