C#编程总结(十)字符转码
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转码
要点:将字符 < 和 > 在嵌入到文本块中时被编码为 < 和 >
如果在 HTTP 流中传递空白和标点之类的字符,则它们在接收端可能会被错误地解释。 HTML 编码将 HTML 中不允许使用的字符转换为等效字符实体;HTML 解码会反转此编码过程。 例如,为进行 HTTP 传输,字符 < 和 > 在嵌入到文本块中时被编码为 < 和 >。
要编码或解码 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); //结果: <head>you & me</head>
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 |
转换为字节 |
从字节转换 |
|---|---|---|
|
- 或 - |
- 或 - |
|
在这里我们以最基本的字符串类型为例说明。
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#编程总结(十)字符转码的更多相关文章
- 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析
在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- native2ascii.exe 字符转码与反转码
本人最近在做OAF的二次开发,在看别人写的代码时,发现总有类似这样的语句:”\u65e0\u6548\u7684GP\u9879\u76ee\u7f16\u53f7“,这些语句其实是用Java_hom ...
- 【jquery】字符ascii码转换函数
js 字符ascii码转换函数 字符转ascii码:用charCodeAt();ascii码砖字符:用fromCharCode(); 看一个小例子 <script> str="A ...
- 关于htmlspecialchars实体字符转码的问题
php对post过来的数据进行实体字符转码,我的页面编码是gb2312,刚开始是这样: $post = htmlspecialchars ( $post); 取到的$post值为空,但是有时候是好的( ...
- paip.输入法编程---智能动态上屏码儿长调整--.txt
paip.输入法编程---智能动态上屏码儿长调整--.txt 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csd ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- 使用 PowerShell 自动登录Azure
PowerShell 是管理 Azure 的最好方式之一,通过使用 PowerShell 脚本可以把很多的工作自动化.比如对于 Azure 上的虚拟机,可以设置定时关机操作,并在适当的时间把它开机,这 ...
- PHP中Trait特性
Trait是自 PHP 5.4.0 起添加的一个新特性,是 PHP 多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个 ...
- MVC3中如何输出富文本
MVC3中如何输出富文本 在网站的文本输出中,经常会将DB里的文本输出到页面上. 一般来说是直接利用MVC3中的ViewBag将文本带到前台并表示, 或是是直接以<%:model.data%&g ...
- linux-redis
1.下载 6.启动 ./redis-server ../conf/redis.conf 7.测试 ./redis-cli -p 7030 set str "hello" ./red ...
- Android项目中,在一个数据库里建立多张表
一,创建一个公共的DBAdapter; 为了在整个程序运行期间调用该公共的数据库,我们定义了一个扩展自Application的CommDB类: 1,创建唯一的数据库: public class Com ...
- Android线程处理之Handler
上一篇已经简单为大家介绍了一下关于Handler的使用,本篇我们就一起再来探讨一下Handler的高级使用,上一篇我们仅仅是简单的进行UI界面的更新,本篇我们来一起探讨一下如何把子线程的数据发送到主线 ...
- Docker之Linux UnionFS
UnionFS UnionFS是一种为Linux,FreeBSD和NetBSD操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务.它使用branch把不同文件系统的文件和目录"透 ...
- linux分享六:进程管理
1:批量杀死进程 ps -ef|grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9 或kill -9 `ps -ef|grep oracle|aw ...
- Screenfly – 各种设备的屏幕和分辨率下快速测试网站
Screenfly 让你能够在各种设备的屏幕和分辨率下查看你的网站.输入网址,并点击GO开始浏览网页.Screenfly 可以使用代理服务器来模拟设备,当您查看您的网站,代理服务器模仿您所选择的设备的 ...
- Android序列化之Serializable和Parcelable
PS:还有几天就开学了.先来一发. 学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Par ...