?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Z适应某种Ҏ需要,字符需要根据规则进行{码,便于传输、展C及其他操作等?/span>
看看下面的{码,q道他的用处了?/span>
1、字W串转码
Ҏ原编码格式与目标~码格式Q完成{换。不q可能出Cؕ码哦。上一章已l介l过了?/span>
代码Q?/span>
复制代码
/// <summary>
/// 字符串编码{?/span>
/// </summary>
/// <param name="srcEncoding">原编?lt;/param>
/// <param name="dstEncoding">目标~码</param>
/// <param name="srcBytes">原字W串</param>
/// <returns>字符?lt;/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);
}
复制代码
试用例Q?/span>
input = "Ƣ迎来到转码世界Q?quot;;
result = Transfer.TransferEncoding(Encoding.Default, Encoding.UTF8, input);//Ƣ迎来到转码世界Q?/span>
Console.WriteLine("TransferEncoding l果Q{0}",result);
result = Transfer.TransferEncoding(Encoding.UTF8,Encoding.Default,result);
Console.WriteLine("TransferEncoding 反{码结果:{0}", result);//Ƣ迎来到转码世界Q?/span>
2、Html转码
要点Q将字符 < ?> 在嵌入到文本块中时被~码?< ?>
如果?HTTP 中传递空白和标点之类的字W,则它们在接收端可能会被错误地解释?HTML ~码?HTML 中不允许使用的字W{换ؓ{效字符实体QHTML 解码会反转此~码q程?例如Qؓq行 HTTP 传输Q字W?< ?> 在嵌入到文本块中时被~码?< ?>?/span>
要编码或解码 Web 应用E序之外的|请?WebUtility cR?/span>
转码Q?/span>
复制代码
/// <summary>
/// html转码
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string HtmlEncode(string html)
{
return HttpUtility.HtmlEncode(html);//System.Net.WebUtility.HtmlEncode(html);
}
复制代码
解码Q?/span>
复制代码
/// <summary>
/// html解码
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string HtmlDecode(string html)
{
return HttpUtility.HtmlDecode(html);//System.Net.WebUtility.HtmlDecode(html);
}
复制代码
试用例Q?/span>
复制代码
//HtmlEncode试
result = string.Empty;
input = "<head>you & me</head>";
result = Transfer.HtmlEncode(input); //l果Q?<head>you & me</head>
Console.WriteLine("Html Encode: {0}", result);
result = Transfer.HtmlDecode(result);//l果Q?<head>you & me</head>
Console.WriteLine("Html Decode: {0}",result);
复制代码
3、Url~码
要点Q对URL的特D字W进行{义,使其合法?/span>
可用于对整个 URLQ包括查询字W串|q行~码的方法。如果在 HTTP 中传递空白和标点之类的字W,则它们在接收端可能会被错误地解释?URL ~码?URL 中不允许使用的字W{换ؓ{效字符实体QURL 解码会反转此~码q程?例如Q当嵌入到要?URL 中传输的文本块中Ӟ字符 < ?> 分别被编码ؓ %3c ?%3e?/span>
默认情况?HttpUtility.UrlEncode Ҏ使用 UTF-8 ~码?因此Q?UrlEncode Ҏ提供l果相同使用 UrlEncode Ҏq指?UTF8 作ؓW二个参数?/span>
UrlEncode 是一U简便方式,用于在运行时?ASP.NET 应用E序讉K UrlEncode Ҏ?在内部,UrlEncode 使用 UrlEncode Ҏ输入字符丌Ӏ?/span>
要编码或解码 Web 应用E序之外的|请?WebUtility cR?/span>
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);
}
复制代码
试用例Q?/span>
//UrlEncode试
input = "http://www.baidu.com?username=<find>&content=ab c";
result = Transfer.UrlEncode(input);//l果Qhttp%3a%2f%2fwww.baidu.com%3fusername%3d%3cfind%3e%26content%3dab+c
Console.WriteLine("Url Encode: {0}",result);
result = Transfer.UrlDecode(result);//l果Qhttp://www.baidu.com?username=<find>&content=ab c
Console.WriteLine("Url Decode: {0}", result);
4、Base64
Base64内容传送编码被设计用来把Q意序列的8位字节描qCؓ一U不易被人直接识别的形式?/span>
要点Q采?4个基本的ASCII码字W对数据q行重新~码Q用于加密和传输?/span>
~码规则
Base64~码的思想是是采用64个基本的ASCII码字W对数据q行重新~码。它需要编码的数据拆分成字节数l。以3个字节ؓ一l。按序排列24 位数据,再把q?4位数据分?l,xl?位。再在每l的的最高位前补两个0凑一个字节。这样就把一?字节Zl的数据重新~码成了4个字节。当所要编码的数据的字节数不是3的整倍数Q也是说在分组时最后一l不?个字节。这时在最后一l填???字节。ƈ在最后编码完成后在结添????”?/span>
例:对ABCq行BASE64~码Q?/span>
1、首先取ABC对应的ASCII码倹{AQ?5QBQ?6QCQ?7Q;
2、再取二q制值AQ?1000001QBQ?1000010QCQ?1000011Q;
3、然后把q三个字节的二进制码接v来(010000010100001001000011Q;
4?再以6位ؓ单位分成4个数据块,q在最高位填充两个0后Ş?个字节的~码后的|Q?0010000Q(00010100Q(00001001Q(00000011Q,其中蓝色部分为真实数据;
5、再把这四个字节数据转化?0q制数得Q?6Q(20Q(9Q(3Q;
6、最后根据BASE64l出?4个基本字W表Q查出对应的ASCII码字W(QQ(UQ(JQ(DQ,q里的值实际就是数据在字符表中的烦引?/span>
BASE64字符表:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
应用Q?/span>
1、Base64~码可用于在HTTP环境下传递较长的标识信息
2、Base64 也会l常用作一个简单的“加密”来保护某些数据Q比如URLQ而真正的加密通常都比较繁琐?/span>
代码实现
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解码Q?/span>
复制代码
/// <summary>
/// Base64字符串解?/span>
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string FromBase64(string input)
{
byte[] bytes = Convert.FromBase64String(input);
return Convert.ToBase64String(bytes);
}
复制代码
试用例Q?/span>
//Base64转码试
input = "Coming from the new world!";
result = Transfer.ToBase64(input); //l果QQ29taW5nIGZyb20gdGhlIG5ldyB3b3JsZCE=
Console.WriteLine("ToBase64 : {0}",result);
result = Transfer.FromBase64(result); //l果QComing from the new world!
Console.WriteLine("FromBase64 : {0}", result);
5、BitConverter
基数据cd与字节数l相互{换?/span>
BitConverter cM一pd字节的Ş式有助于操控基本H体中的值类型?一个字节定义ؓ一?8 位无W号整数?如下表所C,BitConverter cd括用静态方法将每个基元cd转换成字节数l和字节数l{换成其基元类型?/span>
Type
转换为字?/span>
从字节{?/span>
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
在这里我们以最基本的字W串cdZ说明?/span>
byte转ؓString
复制代码
/// <summary>
/// 字节数组转ؓ字符?/span>
/// 指定的字节数组的每个元素的数D{换ؓ它的{效十六q制字符串表CŞ式?/span>
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string BitToString(byte[] bytes)
{
if (bytes == null)
{
return null;
}
//指定的字节数组的每个元素的数D{换ؓ它的{效十六q制字符串表CŞ式?/span>
return BitConverter.ToString(bytes);
}
复制代码
十六q制string转byte
复制代码
/// <summary>
/// 十六进制字W串转ؓ字节数组
/// </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;
}
复制代码
试用例Q?/span>
复制代码
//bit转码
input = "Coming from the new world!";
result = Transfer.BitToString(Encoding.UTF8.GetBytes(input)); //l果Q?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)); //l果QComing from the new world!
C