編碼和解碼(字符串與byte[]之間的轉換)

資源來自互聯網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位整數表示。

 

  1. using   System.Text;     
  2.       
  3.   byte[]   b=Encoding.ASCII.GetBytes("yourstring");     
  4.  //  獲得:121,111,117,114,115,116,114,105,110,103    
  5.   
  6.    
  7.   
  8.   /反向爲:     
  9.   byte[]   b=new   byte[]{121,111,117,114,115,116,114,105,110,103};     
  10.   string   str=Encoding.ASCII.GetString(b);     
  11.   //獲得:str="yourstring"     
相關文章
相關標籤/搜索