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


資源來自互聯網http://www.cnblogs.com/dabaopku/archive/2012/02/27/2370446.html

 非常蛋疼的事情, 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加解密技術。這里重點講解一下編碼、解碼以及亂碼的相關問題。

我們先看一個簡單的例子

string str = "abcd"; //測試字符串
byte[] bytes = Encoding.GetEncoding("ascii").GetBytes(str); //將字符串轉成ascii編碼的字節數組,這里的bytes數組,長度為4,分別對應於abcd的ascii碼97、98、99、100
string result = Encoding.GetEncoding("ascii").GetString(bytes); //將字節數組轉回為字符串
Console.WriteLine(result); //輸出abcd

 

ascii碼是國際標准編碼,全稱為:美國信息交換標准編碼,只能表示127個字符,不能代表漢字,

我們對漢字進行ascii編碼之后,是不能進行還原的。漢字不能轉變為ascii碼,因此會變成亂碼,對亂碼進行還原也就還原不了了。

項目開發中經常會有出現亂碼的情況

       這就是由於兩端(服務端、請求端)編解碼的方式不一致造成的。

      比如服務端是utf-8編碼,而在客戶端以gbk接收,那么就會出現亂碼。

所以解決亂碼這個問題,思路就是從對方的編碼方式入手,弄清楚對方的編碼是什么編碼,我這邊就以什么編碼來解碼

 

同一個字符在不同的編碼下會被編成不同長度的編碼,

比如:ACSII,每個字符對應一個字節,實際上只使用了7位,從00h-7Fh。只能表達128個字符。

GB2312, 中文的一種編碼, 每個字符使用兩個字節表示。

UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是針對Unicode的一種可變長度字符編碼。
UTF - 8, 可以表達所有unicode字符, 每個字符可以用1 - 3 個字節表示。
UTF - 16, 可以表達所有unicode字符, 每個字符可以用1 - 2 個16位整數表示。
UTF - 32, 可以表達所有unicode字符, 每個字符可以用1個32位整數表示。

using System.Text;
byte[] b = Encoding.ASCII.GetBytes("yourstring");
//  得到:121,111,117,114,115,116,114,105,110,103    
/反向為:     
byte[] b = new byte[]
{
    121, 111, 117, 114, 115, 116, 114, 105, 110, 103
};
string str = Encoding.ASCII.GetString(b);
//得到:str="yourstring"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM