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. [安卓] 16、ListView和GridView结合显示单元实现自定义列表显示效果

    List在各种手机应用中都有体现,是安卓UI设计的必修课. 本文将介绍在开发中如何利用ListView和GridView设计自定义列表. 下面分别是用ListView和GridView做的效果: 上面 ...

  2. [ACM_几何] Wall

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28417#problem/E 题目大意:依次给n个点围成的一个城堡,在周围建围墙,要求围墙 ...

  3. Winform文件下载之WinINet

    在C#中,除了webclient我们还可以使用一组WindowsAPI来完成下载任务.这就是Windows Internet,简称 WinINet.本文通过一个demo来介绍WinINet的基本用法和 ...

  4. Java中equals与==和comparaTo的区别

    一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...

  5. loglikelihood ratio 相似度

    摘要: 在机器学习中常用到各种距离或者相似度,今天在看美团推荐系统重排序的文章时看到了loglikelihood ratio 相似度,特总结起来.以后有时间再把常用的相似度或者距离梳理到一篇文章. 背 ...

  6. NodeJS实例系列~环境搭建,Hello world归来!

    回到目录 1 安装Node.js服务端程序 https://github.com/Microsoft/nodejstools/wiki/Install-Node.js-and-get-started- ...

  7. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  8. 使用 flow.ci 实现 Android 自动化测试与持续集成

    在上篇文章--如何实现 Android 应用的持续部署中,我们使用的是 flow.ci + Github + fir.im 实现 Android 应用的持续部署.对于 Android 开发者,他们可能 ...

  9. jquery.validate 基础

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. javascript中Date对象的应用——简易日历的实现

    × 目录 [1]效果 [2]HTML [3]CSS[4]JS 前面的话 简易日历作为javascript中Date对象的常见应用,用途较广泛.本文将详细说明简易日历的实现思路 效果演示 HTML说明 ...