Encoding類


一、編碼分很多種,編碼的格式,多少字節表示一個字非常復雜,不懂這個。寫幾個懂得記下。

  編碼與解碼:  

  計算機中儲存的信息都是用二進制數表示的;而我們在屏幕上看到的英文、漢字等字符是二進制數轉換之后的結果。通俗的說,按照何種規則將字符存儲在計算機中,如'a'字符用什么表示,稱為"編碼";反之,將存儲在計算機中的二進制數解析顯示出來,稱為"解碼"。在解碼過程中,如果使用了錯誤的解碼規則,則會導致出現亂碼。

  字符集(Charset):是一個系統支持的所有抽象字符的集合。字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。說白了就是所有的字符。

  字符編碼(Character Encoding):是一套法則,使用該法則能夠對自然語言的字符的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈沖)進行配對。即在符號集合與數字系統之間建立對應關系,它是信息處理的一項基本技術。通常人們用符號集合(一般情況下就是文字)來表達信息。而以計算機為基礎的信息處理系統則是利用元件(硬件)不同狀態的組合來存儲和處理信息的。元件不同狀態的組合能代表數字系統的數字,因此字符編碼就是將符號轉換為計算機可以接受的數字系統的數,稱為數字代碼。說白了就是一個將文字和計算機能存儲的數據交互的規則。

  常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

  ASCII字符集和編碼,美國現代英語用。

  BIG5字符集和編碼,繁體中文用編碼。

  GB2312字符集和編碼,簡體中文用編碼。

  GB18030字符集和編碼,是新版的中文簡體用編碼。

  Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三種字符編碼方案。

  至於1個字對應多少個字節,那些就不管了。

進入本人正題,在C#中Encoding類主要用於編碼相關的處理。其屬性如下:

ASCII           獲取 ASCII(7 位)字符集的編碼。
BigEndianUnicode     獲取使用 Big-Endian 字節順序的 UTF-16 格式的編碼。
BodyName         在派生類中重寫時,獲取可與郵件代理正文標記一起使用的當前編碼的名稱。
CodePage          在派生類中重寫時,獲取當前 Encoding 的代碼頁標識符。
DecoderFallback       獲取或設置當前 Encoding 對象的 DecoderFallback 對象。
Default          獲取系統的當前 ANSI 代碼頁的編碼。
EncoderFallback       獲取或設置當前 Encoding 對象的 EncoderFallback 對象。
EncodingName       在派生類中重寫時,獲取當前編碼的可讀說明。
HeaderName        在派生類中重寫時,獲取可與郵件代理標題標記一起使用的當前編碼的名稱。
IsBrowserDisplay     在派生類中重寫時,獲取一個值,該值指示瀏覽器客戶端是否可以使用當前的編碼顯示內容。
IsBrowserSave      在派生類中重寫時,獲取一個值,該值指示瀏覽器客戶端是否可以使用當前的編碼保存內容。
IsMailNewsDisplay     在派生類中重寫時,獲取一個值,該值指示郵件和新聞客戶端是否可以使用當前的編碼顯示內容。
IsMailNewsSave       在派生類中重寫時,獲取一個值,該值指示郵件和新聞客戶端是否可以使用當前的編碼保存內容。
IsReadOnly         在派生類中重寫時,獲取一個值,該值指示當前的編碼是否為只讀。
IsSingleByte        在派生類中重寫時,獲取一個值,該值指示當前的編碼是否使用單字節碼位。
Unicode           獲取使用 Little-Endian 字節順序的 UTF-16 格式的編碼。
UTF32           獲取使用 Little-Endian 字節順序的 UTF-32 格式的編碼。
UTF7             獲取 UTF-7 格式的編碼。
UTF8           獲取 UTF-8 格式的編碼。
WebName        在派生類中重寫時,獲取在 Internet 編號分配管理機構 (IANA) 注冊的當前編碼的名稱。
WindowsCodePage    在派生類中重寫時,獲取與當前編碼最緊密對應的 Windows 操作系統代碼頁。

 

剛開屬性還看不懂,后來仔細看了看,發現這個類的屬性非常奇怪,居然是自己返回自己。例如

public static Encoding UTF8 { get; }  可以看到UTF8這個類返回的是一個Encoding對象。但是又看了看源代碼,發現Encoding是一個抽象類,因此基本可以判斷,此屬性返回是該對象的一個實現類的對象。返回的實現對象的類一般是用它的方法,不懂啊,先記下它的方法。
  

Clone         當在派生類中重寫時,創建當前 Encoding 對象的一個淺表副本。
Convert         已重載。 將字節數組從一種編碼轉換為另一種。
GetByteCount      已重載。 在派生類中重寫時,計算對一組字符進行編碼所產生的字節數。
GetBytes       已重載。 在派生類中重寫時,將一組字符編碼為一個字節序列。
GetCharCount      已重載。 在派生類中重寫時,計算對字節序列進行解碼所產生的字符數。
GetChars       已重載。 在派生類中重寫時,將一個字節序列解碼為一組字符。
GetDecoder       在派生類中重寫時,獲取一個解碼器,該解碼器將已編碼的字節序列轉換為字符序列。
GetEncoder       在派生類中重寫時,獲取一個解碼器,該解碼器將 Unicode 字符序列轉換為已編碼的字節序列。
GetEncoding      已重載。 返回指定代碼頁的編碼。
GetEncodings      返回包含所有編碼的數組。
GetHashCode      已重寫。 返回當前實例的哈希代碼。
GetMaxByteCount   在派生類中重寫時,計算對指定數目的字符進行編碼所產生的最大字節數。
GetMaxCharCount   在派生類中重寫時,計算對指定數目的字節進行解碼時所產生的最大字符數。
GetPreamble      在派生類中重寫時,返回指定所用編碼的字節序列。
GetString       已重載。 在派生類中重寫時,將一個字節序列解碼為一個字符串。
IsAlwaysNormalized    已重載。 獲取一個值,該值指示當前編碼是否始終被正常化。

        static void Main(string[] args)
        {
            string str = "你好嗎?";
            byte[] bytes = Encoding.UTF8.GetBytes(str);     //按照UTF8編碼規則,編碼字符串str,返回bytes數組。這個東西就是8位00000000-11111111存入硬盤的東西
            foreach (byte b in bytes)
            {
                Console.Write(b + " ");             //輸出這12個元素看看是什么東西 228 189 ....... 輸出的都是byte范圍內的數字
            }
            Console.WriteLine("\n共有字節數:" + Encoding.UTF8.GetByteCount(str)); //輸出12,也就是bytes數組的元素個數
            Console.WriteLine(Encoding.ASCII.GetString(bytes));    //用另外一種編碼規則解碼,看看得到什么?    輸出 ???????????? 不同與編碼規則的解碼方法是解碼不到值的。
            Console.WriteLine(Encoding.UTF8.GetString(bytes));  //用UTF8編碼規則由byte數組,解碼回字符串  輸出 你好嗎? 哈哈終於正確了
            Console.WriteLine(Encoding.UTF8.GetString(bytes, 3, 6));   //該方法的重載允許指定解碼的數組范圍, 本處輸出 好嗎      你和問好不解碼。
            Console.WriteLine(Encoding.GetEncoding("UTF-8"));   //輸出System.Text.UTF8Encoding
            Console.WriteLine(Encoding.UTF8.GetCharCount(bytes));   //返回解碼后的字符的個數   此處返回4,正確
            Char[] chArr = Encoding.UTF8.GetChars(bytes);   //將解碼后的內容輸出到字符數組中
            foreach (char c in chArr)
            {
                Console.Write(c + " - ");   //輸出  你 - 好 - 嗎 - ? -
            }
            Console.WriteLine(Encoding.UTF8.GetMaxCharCount(12));   //對12個元素的byte數組進行解碼產生的最大字符數 13
            Console.WriteLine(Encoding.UTF8.GetMaxByteCount(12));   //對12個字符進行編碼產生的最大字節數    39
            Console.ReadKey();
        }

 再來看一道有趣的面試題

        static void Main(string[] args)
        {
            string str = "ab某某";
            int l1 = System.Text.Encoding.UTF8.GetBytes(str).Length;
            Console.WriteLine(l1);      //輸出 8
            int l2 = System.Text.Encoding.Default.GetBytes(str).Length;
            Console.WriteLine(l2);      //輸出 6
            int l3 = str.Length;
            Console.WriteLine(l3);      //輸出 4

            Console.Write(System.Text.Encoding.Default.EncodingName);   //輸出 簡體中文<GB2312>

            Console.ReadKey();
        }

 

 


免責聲明!

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



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