资源来自互联网http://www.cnblogs.com/dabaopku/archive/2012/02/27/2370446.htmlhtml
很是蛋疼的事情, google 和 baidu 在编码是分别采用了 UTF-8 和 GB2312算法
基础知识数据库
UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节。
不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节。数组
public
static
string
MyUrlDeCode(
string
str, Encoding encoding)
{
if
(encoding ==
null
)
{
Encoding utf8 = Encoding.UTF8;
//首先用utf-8进行解码
string
code = HttpUtility.UrlDecode(str.ToUpper(), utf8);
//将已经解码的字符再次进行编码.
string
encode = HttpUtility.UrlEncode(code, utf8).ToUpper();
if
(str == encode)
encoding = Encoding.UTF8;
else
encoding = Encoding.GetEncoding(
"gb2312"
);
}
return
HttpUtility.UrlDecode(str, encoding);
}
|
编码、解码技术是咱们在程序中开发中常常使用到的,对一些敏感信息的存储,好比密码之类的,咱们通常是不会直接以明文直接存储到数据库的,而是会经过各类算法,能够是现成的MD5(一种散列算法)、或者是Hash算法+Salt(混淆因子),甚至是本身定义的一套算法进行加解密。这里不想阐述加解密技术,在以前的一篇博客当中,简单列举了两种基本方法,见.NET加解密技术。这里重点讲解一下编码、解码以及乱码的相关问题。测试
咱们先看一个简单的例子google
string str = "abcd";//测试字符串
byte[] bytes = Encoding.GetEncoding("ascii").GetBytes(str);//将字符串转成ascii编码的字节数组,这里的bytes数组,长度为4,分别对应于abcd的ascii码9七、9八、9九、100
string result = Encoding.GetEncoding("ascii").GetString(bytes);//将字节数组转回为字符串
Console.WriteLine(result);//输出abcd编码
ascii码是国际标准编码,全称为:美国信息交换标准编码,只能表示127个字符,不能表明汉字,spa
咱们对汉字进行ascii编码以后,是不能进行还原的。汉字不能转变为ascii码,所以会变成乱码,对乱码进行还原也就还原不了了。.net
项目开发中常常会有出现乱码的状况,这就是因为两端(服务端、请求端)编解码的方式不一致形成的。好比服务端是utf-8编码,而在客户端以gbk接收,那么就会出现乱码。因此解决乱码这个问题,思路就是从对方的编码方式入手,弄清楚对方的编码是什么编码,我这边就以什么编码来解码code
同一个字符在不一样的编码下会被编成不一样长度的编码,
好比:ACSII,每一个字符对应一个字节,实际上只使用了7位,从00h-7Fh。只能表达128个字符。
GB2312,中文的一种编码,每一个字符使用两个字节表示。
UTF-8, 能够表达全部unicode字符,每一个字符能够用1-3个字节表示。
UTF-16, 能够表达全部unicode字符,每一个字符能够用1-2个16位整数表示。
UTF-32, 能够表达全部unicode字符,每一个字符能够用1个32位整数表示。