C#编程总结(十)字符转码

为了适应某种特殊需要,字符需要根据规则进行转码,便于传输、展现以及其他操作等。

看看下面的转码,就知道他的用处了。

1、字符串转码

根据原编码格式与目标编码格式,完成转换。不过可能出现乱码哦。上一章已经介绍过了。

代码:

        /// <summary>
/// 字符串编码转换
/// </summary>
/// <param name="srcEncoding">原编码</param>
/// <param name="dstEncoding">目标编码</param>
/// <param name="srcBytes">原字符串</param>
/// <returns>字符串</returns>
public 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);
}

测试用例:

            input = "欢迎来到转码世界!";
result = Transfer.TransferEncoding(Encoding.Default, Encoding.UTF8, input);//欢迎来到转码世界!
Console.WriteLine("TransferEncoding 结果:{0}",result);
result = Transfer.TransferEncoding(Encoding.UTF8,Encoding.Default,result);
Console.WriteLine("TransferEncoding 反转码结果:{0}", result);//欢迎来到转码世界!

2、Html转码

要点:将字符 < 和 > 在嵌入到文本块中时被编码为 &lt; 和 &gt;

如果在 HTTP 流中传递空白和标点之类的字符,则它们在接收端可能会被错误地解释。 HTML 编码将 HTML 中不允许使用的字符转换为等效字符实体;HTML 解码会反转此编码过程。 例如,为进行 HTTP 传输,字符 < 和 > 在嵌入到文本块中时被编码为 &lt; 和 &gt;。
要编码或解码 Web 应用程序之外的值,请使用 WebUtility 类。

转码:

        /// <summary>
/// html转码
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string HtmlEncode(string html)
{
return HttpUtility.HtmlEncode(html);//System.Net.WebUtility.HtmlEncode(html);
}

解码:

        /// <summary>
/// html解码
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string HtmlDecode(string html)
{
return HttpUtility.HtmlDecode(html);//System.Net.WebUtility.HtmlDecode(html);
}

测试用例:

            //HtmlEncode测试
result = string.Empty;
input = "<head>you & me</head>";
result = Transfer.HtmlEncode(input); //结果: &lt;head&gt;you &amp; me&lt;/head&gt;
Console.WriteLine("Html Encode: {0}", result);
result = Transfer.HtmlDecode(result);//结果: <head>you & me</head>
Console.WriteLine("Html Decode: {0}",result);

3、Url编码

要点:对URL的特殊字符进行转义,使其合法。

可用于对整个 URL(包括查询字符串值)进行编码的方法。如果在 HTTP 流中传递空白和标点之类的字符,则它们在接收端可能会被错误地解释。 URL 编码将 URL 中不允许使用的字符转换为等效字符实体;URL 解码会反转此编码过程。 例如,当嵌入到要在 URL 中传输的文本块中时,字符 < 和 > 分别被编码为 %3c 和 %3e。

默认情况下 HttpUtility.UrlEncode 方法使用 UTF-8 编码。 因此,使用 UrlEncode 方法提供结果相同使用 UrlEncode 方法并指定 UTF8 作为第二个参数。
UrlEncode 是一种简便方式,用于在运行时从 ASP.NET 应用程序访问 UrlEncode 方法。 在内部,UrlEncode 使用 UrlEncode 方法输入字符串。
要编码或解码 Web 应用程序之外的值,请使用 WebUtility 类。

HttpUtility的命名空间:System.Web

Url转码

        /// <summary>
/// Url转码
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string UrlEncode(string url)
{
return HttpUtility.UrlEncode(url);
}

Url解码

        /// <summary>
/// Url解码
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string UrlDecode(string url)
{
return HttpUtility.UrlDecode(url);
}

测试用例:

            //UrlEncode测试
input = "http://www.baidu.com?username=<find>&content=ab c";
result = Transfer.UrlEncode(input);//结果:http%3a%2f%2fwww.baidu.com%3fusername%3d%3cfind%3e%26content%3dab+c
Console.WriteLine("Url Encode: {0}",result);
result = Transfer.UrlDecode(result);//结果:http://www.baidu.com?username=<find>&content=ab c
Console.WriteLine("Url Decode: {0}", result);

4、Base64

Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。

要点:采用64个基本的ASCII码字符对数据进行重新编码,用于加密和传输。

编码规则

Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个 “=”。

例:将对ABC进行BASE64编码:

1、首先取ABC对应的ASCII码值。A(65)B(66)C(67);
2、再取二进制值A(01000001)B(01000010)C(01000011);
3、然后把这三个字节的二进制码接起来(010000010100001001000011);
4、 再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100)(00001001)(00000011),其中蓝色部分为真实数据;
5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);
6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。

BASE64字符表

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

应用:

1、Base64编码可用于在HTTP环境下传递较长的标识信息

2、Base64 也会经常用作一个简单的“加密”来保护某些数据,比如URL,而真正的加密通常都比较繁琐。

代码实现

Base64转码

        /// <summary>
/// Base64转码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string ToBase64(string input)
{
byte[] bytes = Encoding.UTF8.GetBytes(input);
return Convert.ToBase64String(bytes);
}

Base64解码:

        /// <summary>
/// Base64字符串解码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string FromBase64(string input)
{
byte[] bytes = Convert.FromBase64String(input);
return Convert.ToBase64String(bytes);
}

测试用例:

            //Base64转码测试
input = "Coming from the new world!";
result = Transfer.ToBase64(input); //结果:Q29taW5nIGZyb20gdGhlIG5ldyB3b3JsZCE=
Console.WriteLine("ToBase64 : {0}",result);
result = Transfer.FromBase64(result); //结果:Coming from the new world!
Console.WriteLine("FromBase64 : {0}", result);

5、BitConverter

将基础数据类型与字节数组相互转换。
BitConverter 类以一系列字节的形式有助于操控基本窗体中的值类型。 一个字节定义为一个 8 位无符号整数。 如下表所示,BitConverter 类包括用静态方法将每个基元类型转换成字节数组和将字节数组转换成其基元类型。

Type

转换为字节

从字节转换

Boolean

GetBytes(Boolean)

ToBoolean

Char

GetBytes(Char)

ToChar

Double

GetBytes(Double)

- 或 -

DoubleToInt64Bits(Double)

ToDouble

- 或 -

Int64BitsToDouble

Int16

GetBytes(Int16)

ToInt16

Int32

GetBytes(Int32)

ToInt32

Int64

GetBytes(Int64)

ToInt64

Single

GetBytes(Single)

ToSingle

UInt16

GetBytes(UInt16)

ToUInt16

UInt32

GetBytes(UInt32)

ToUInt32

UInt64

GetBytes(UInt64)

ToUInt64

在这里我们以最基本的字符串类型为例说明。

byte转为String

        /// <summary>
/// 字节数组转为字符串
/// 将指定的字节数组的每个元素的数值转换为它的等效十六进制字符串表示形式。
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string BitToString(byte[] bytes)
{
if (bytes == null)
{
return null;
}
//将指定的字节数组的每个元素的数值转换为它的等效十六进制字符串表示形式。
return BitConverter.ToString(bytes);
}

十六进制string转byte

        /// <summary>
/// 将十六进制字符串转为字节数组
/// </summary>
/// <param name="bitStr"></param>
/// <returns></returns>
public static byte[] FromBitString(string bitStr)
{
if (bitStr == null)
{
return null;
} string[] sInput = bitStr.Split("-".ToCharArray());
byte[] data = new byte[sInput.Length];
for (int i = ; i < sInput.Length; i++)
{
data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
} return data;
}

测试用例:

            //bit转码
input = "Coming from the new world!";
result = Transfer.BitToString(Encoding.UTF8.GetBytes(input)); //结果: 43-6F-6D-69-6E-67-20-66-72-6F-6D-20-74-68-65-20-6E-65-77-20-77-6F-72-6C-64-21
Console.WriteLine("BitToString : {0}", result);
result = Encoding.UTF8.GetString(Transfer.FromBitString(result)); //结果:Coming from the new world!
Console.WriteLine("FromBitString : {0}", result);

 运行截图:

C#编程总结(十)字符转码的更多相关文章

  1. 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

    在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...

  2. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. native2ascii.exe 字符转码与反转码

    本人最近在做OAF的二次开发,在看别人写的代码时,发现总有类似这样的语句:”\u65e0\u6548\u7684GP\u9879\u76ee\u7f16\u53f7“,这些语句其实是用Java_hom ...

  5. 【jquery】字符ascii码转换函数

    js 字符ascii码转换函数 字符转ascii码:用charCodeAt();ascii码砖字符:用fromCharCode(); 看一个小例子 <script> str="A ...

  6. 关于htmlspecialchars实体字符转码的问题

    php对post过来的数据进行实体字符转码,我的页面编码是gb2312,刚开始是这样: $post = htmlspecialchars ( $post); 取到的$post值为空,但是有时候是好的( ...

  7. paip.输入法编程---智能动态上屏码儿长调整--.txt

    paip.输入法编程---智能动态上屏码儿长调整--.txt 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csd ...

  8. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras

    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras 最近得到一些Unity官方视频教程,一看全是纯英文的讲解,没有任何字幕或者 ...

  2. 生成格式化的json

    public static ContentResult returnJson(object obj) { var content = new ContentResult() { Content = J ...

  3. Oracle数据库面试题【转载】

    1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windo ...

  4. Atitit mtp ptp rndis midi协议的不同区别

    Atitit mtp ptp rndis midi协议的不同区别 1. PTP:1 2. MTP:1 3. Mtp 与usb区别2 4. 不过和UMS相比,MTP也有不足之处:3 5.  MTP协议介 ...

  5. paip.lucene 4.3 中文语义搜索最佳实践

    paip.lucene 4.3 中文语义搜索最佳实践 首先一个问题是要不要使用lucene 自带的分词器...我觉得最好不使用哪自带的分词器.效果还凑火,就是不好控制... 先使用ik,ict,mms ...

  6. transform:rotate()将元素进行不同角度的旋转

    通过设置transform:rotate()可以将元素进行不同角度的旋转: 下面是一些测试代码: <!DOCTYPE html> <html> <head> < ...

  7. 快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...

  8. KlayGE 4.4中渲染的改进(一):只需要SM3的TBDR

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2736 KlayGE从4.0开始引入deferred rendering层(DR),并且这几个 ...

  9. WPF中实现验证码功能

    其实和winform中的实现差不多,只是由于WPF中控件使用的库与winform中的有区别,大体上还是差不多的,直接看代码: 产生验证码的类:ValidCode.cs public class Val ...

  10. codeforces Soldier and Number Game(dp+素数筛选)

    D. Soldier and Number Game time limit per test3 seconds memory limit per test256 megabytes inputstan ...