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

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

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 = 0; 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. C#编程总结(十)字符转码

    C#编程总结(十)字符转码 为了适应某种特殊需要,字符需要根据规则进行转码,便于传输.展现以及其他操作等. 看看下面的转码,就知道他的用处了. 1.字符串转码 根据原编码格式与目标编码格式,完成转换. ...

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

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

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

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

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

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

  5. Apache Beam WordCount编程实战及源码解读

    概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流 ...

  6. python:字符串转换成字节的三种方式及字符转码问题

    str='zifuchuang' 第一种 b'zifuchuang'第二种bytes('zifuchuang',encoding='utf-8')第三种('zifuchuang').encode('u ...

  7. Go url编码和字符转码

    类似php中的urlencode 和htmlspecialchars: package main import ( "fmt" "html" "net ...

  8. cesium编程中级(二)源码编译

    cesium编程中级(二)源码编译 有些情况下,比如我们自己从Github下载了最新的代码,或者自己临时修改了一点代码,想要编译后的Build文件夹的内容,需要自行编译源码,这里介绍一下编译的方法 下 ...

  9. String中文字符转码

    如何使用String构造方法和String.getBytes()做好中文字符转码 @Test public void test() { String testStr = "中"; ...

随机推荐

  1. HDU 4162 最小表示法

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4162 题意:给定一个只有0-7数字组成的串.现在要由原串构造出一个新串,新串的构造方法:相邻2个位置的数字 ...

  2. SU unisam命令学习

  3. 【面试题】BD

    一面: 自我介绍,简单介绍项目: /***********发现项目没什么可问的,然后开始各种基础知识o(╯□╰)o************/ 内存结构,低地址,高地址: STL底层实现,set是否有序 ...

  4. stack

    stack介绍:先进后出 实现C++STL,栈有两个参数:template<class T,class Container = deque<T>> class stack: 参 ...

  5. address元素

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

  6. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  7. 几个Windows电脑小技巧

    1. 为cmd命令提示符设置默认的初始路径: 到开始菜单-附件-属性  里面有起始位置选项 其中%HOMEDRIVE%%HOMEPATH%就代表起始位置 如想每次键cmd进入命令提示符后的初始位置是 ...

  8. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  9. 20130625修改hbase的hbase-env导致导出器导出数据的速度变慢

    将hbase的 export HBASE_OPTS="-ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode" 改为 export ...

  10. CentOS6.4 配置iptables

    如果没有安装iptables可以直接用yum安装 yum install -t iptables 检查iptables服务的状态, service iptables status 如果出现“iptab ...