最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# System.Text.Encoding使用小結(jié)

 更新時(shí)間:2025年07月30日 11:23:59   作者:鯉籽鯤  
System.Text.Encoding類(lèi)及其派生類(lèi)提供了豐富的功能,幫助開(kāi)發(fā)者實(shí)現(xiàn)不同字符編碼之間的轉(zhuǎn)換,本文就來(lái)介紹一下C# System.Text.Encoding使用,感興趣的可以了解一下

前言

在C#編程中,處理字符串和字節(jié)數(shù)組之間的轉(zhuǎn)換是一個(gè)常見(jiàn)的任務(wù)。System.Text.Encoding類(lèi)及其派生類(lèi)提供了豐富的功能,幫助開(kāi)發(fā)者實(shí)現(xiàn)不同字符編碼之間的轉(zhuǎn)換。本文將詳細(xì)講解System.Text.Encoding類(lèi)的使用方法,包括常用編碼的介紹、編碼和解碼的基本操作、以及一些高級(jí)用法。

一、基礎(chǔ)概念

1. 什么是字符編碼?

字符編碼是將字符(如字母、數(shù)字、符號(hào)等)轉(zhuǎn)換為字節(jié)序列的規(guī)則。不同的字符編碼標(biāo)準(zhǔn)(如ASCII、UTF-8、UTF-16等)定義了不同的映射規(guī)則。在計(jì)算機(jī)中,字符編碼用于存儲(chǔ)、傳輸和顯示文本數(shù)據(jù)。

2. 常見(jiàn)的字符編碼

常見(jiàn)的字符編碼包括:

  • ASCII:美國(guó)信息交換標(biāo)準(zhǔn)代碼,使用 7 位二進(jìn)制數(shù)表示 128 個(gè)字符。
    • 特點(diǎn):固定 1 字節(jié),僅支持 0x00-0x7F(英文字符)。
    • 適用場(chǎng)景:純英文文本。
    • 注意:若包含非 ASCII 字符(如中文),會(huì)替換為 ? 或拋出異常
  • UTF-8:一種變長(zhǎng)的字符編碼,可以表示 Unicode 中的所有字符,兼容 ASCII。
    • 特點(diǎn):可變長(zhǎng)度編碼,1-4 字節(jié)表示一個(gè)字符,兼容 ASCII。
    • 適用場(chǎng)景:國(guó)際化文本、網(wǎng)頁(yè)、網(wǎng)絡(luò)傳輸(HTTP/JSON)。
  • Unicode:一種定長(zhǎng)的字符編碼,使用 2 個(gè)字節(jié)表示一個(gè)字符。
    • 特點(diǎn):固定 2 字節(jié)(小端序或大端序),支持基本 Unicode 字符。
    • 適用場(chǎng)景:內(nèi)存中存儲(chǔ)(如 .NET 的 string 類(lèi)型)。

GB2312/GBK/GB18030:中文編碼(需通過(guò) Encoding.GetEncoding 獲取)。

3. 編碼與解碼

  • 編碼(Encoding):將 Unicode 字符轉(zhuǎn)換為字節(jié)序列的過(guò)程。
  • 解碼(Decoding):將字節(jié)序列轉(zhuǎn)換回 Unicode 字符的過(guò)程。
  • 由于計(jì)算機(jī)只認(rèn)識(shí)0或1的二進(jìn)制數(shù)據(jù),而這些數(shù)據(jù)讓人類(lèi)閱讀很有難度的。此時(shí)人 和 計(jì)算機(jī)溝通就需要一個(gè)翻譯。
  • 可以 將ASCII UTF-8等編碼規(guī)則 視作 一本人類(lèi) 與 計(jì)算機(jī) 之間 溝通的翻譯字典,Encoding類(lèi)充當(dāng) 翻譯 的角色。
    • 編碼:就是將 人類(lèi)的語(yǔ)言 通過(guò)翻譯字典 翻譯成計(jì)算機(jī)能看懂的指令
    • 解碼:就是將計(jì)算機(jī)的信息 通過(guò)翻譯字典 翻譯成人類(lèi)可以看懂的語(yǔ)言

4.System.Text.Encoding類(lèi)概述

System.Text.Encoding類(lèi)是.NET框架中用于處理字符編碼的基類(lèi)(核心類(lèi))。它提供了將字符串轉(zhuǎn)換為字節(jié)數(shù)組(編碼)和將字節(jié)數(shù)組轉(zhuǎn)換為字符串(解碼)的方法。Encoding類(lèi)本身是抽象的,不能直接實(shí)例化,但提供了多個(gè)派生類(lèi),每個(gè)派生類(lèi)對(duì)應(yīng)一種特定的字符編碼。

5.Encoding類(lèi)核心功能

  • 支持多種編碼格式(如 UTF-8、ASCII、Unicode 等)。
  • 實(shí)現(xiàn)字符串與字節(jié)數(shù)組的雙向轉(zhuǎn)換。
  • 兼容跨平臺(tái)和多語(yǔ)言場(chǎng)景。

6. 常用方法與屬性

1)核心方法

方法名作用
GetBytes(string)將字符串轉(zhuǎn)換為字節(jié)數(shù)組(編碼過(guò)程)。
GetString(byte[])將字節(jié)數(shù)組轉(zhuǎn)換為字符串(解碼過(guò)程)。
Convert(Encoding, Encoding, byte[])將字節(jié)數(shù)組從一種編碼轉(zhuǎn)換為另一種編碼
(如 UTF-8 轉(zhuǎn) UTF-16)。

2)靜態(tài)屬性

屬性名對(duì)應(yīng)編碼類(lèi)型及代碼頁(yè)適用場(chǎng)景
Encoding.ASCIIASCII 編碼(代碼頁(yè) 20127)僅支持英文字符(0x00-0x7F)。
Encoding.UTF8UTF-8 編碼(代碼頁(yè) 65001)國(guó)際化文本(支持所有 Unicode 字符)。
Encoding.UnicodeUTF-16 小端序(代碼頁(yè) 1200)內(nèi)部存儲(chǔ)(如 .NET 的 char 類(lèi)型)。
Encoding.UTF32UTF-32 小端序(代碼頁(yè) 12000)高精度編碼(占用更多內(nèi)存)。
Encoding.Default當(dāng)前系統(tǒng)默認(rèn) ANSI 編碼(如 GBK、CP1252)兼容性場(chǎng)景(可能因系統(tǒng)而異)。

3)常用字符編碼類(lèi)

以下是一些常用的字符編碼類(lèi)及其對(duì)應(yīng)的編碼標(biāo)準(zhǔn):

字符編碼類(lèi)對(duì)應(yīng)的編碼標(biāo)準(zhǔn)
ASCIIEncoding對(duì)應(yīng)ASCII編碼,支持7位字符。
UTF7Encoding對(duì)應(yīng)UTF-7編碼,一種基于7位的Unicode編碼。
UTF8Encoding對(duì)應(yīng)UTF-8編碼,廣泛用于互聯(lián)網(wǎng)的多字節(jié)Unicode編碼。
UnicodeEncoding對(duì)應(yīng)UTF-16編碼,使用兩個(gè)字節(jié)表示大多數(shù)字符。
ASCIIEncoding對(duì)應(yīng)ASCII編碼,支持7位字符。

二、使用

1. 獲取編碼實(shí)例

using System.Text;

// 獲取 UTF-8 編碼實(shí)例
Encoding utf8Encoding = Encoding.UTF8;

// 獲取 ASCII 編碼實(shí)例
Encoding asciiEncoding = Encoding.ASCII;

// 獲取 Unicode 編碼實(shí)例
Encoding unicodeEncoding = Encoding.Unicode;

// 通過(guò)GetEncoding 獲取 GB2312 編碼實(shí)例
Encoding gb2312 = Encoding.GetEncoding("GB2312");

// 獲取 GBK 編碼(代碼頁(yè) 936)
Encoding gbk = Encoding.GetEncoding(936);

// 列出所有支持的編碼
foreach (EncodingInfo ei in Encoding.GetEncodings())
{
    Console.WriteLine($"名稱(chēng): {ei.Name}, 描述: {ei.DisplayName}");
}

2. 獲取編碼信息

static void Main(string[] args)
{
    // 獲取 UTF-8 編碼實(shí)例
    Encoding utf8Encoding = Encoding.UTF8;          
    Console.WriteLine(utf8Encoding.HeaderName);     //輸出:utf-8
    Console.WriteLine(utf8Encoding.EncodingName);   //輸出:Unicode (UTF-8)
    Console.WriteLine(utf8Encoding.BodyName);       //輸出:utf-8
    Console.WriteLine(utf8Encoding.WebName);        //輸出:utf-8
    // 獲取編碼的代碼頁(yè)標(biāo)識(shí)符
    Console.WriteLine(utf8Encoding.CodePage);       //輸出:65001
}

3. 編碼和解碼操作

注意:若使用 Encoding.Default(系統(tǒng)默認(rèn)編碼,如中文環(huán)境下的 GB2312),可能導(dǎo)致跨平臺(tái)亂碼,推薦顯式指定編碼。

1)編碼:將字符串轉(zhuǎn)換為字節(jié)數(shù)組

internal class Program
{
    static void Main(string[] args)
    {
        string text = "Hello, World!";
        // 使用UTF-8編碼
        byte[] utf8Bytes = Encoding.UTF8.GetBytes(text);

        // 使用UTF-16編碼
        byte[] utf16Bytes = Encoding.Unicode.GetBytes(text);

        // 使用ASCII編碼
        byte[] asciiBytes = Encoding.ASCII.GetBytes(text);

        Console.WriteLine("UTF-8 Encoded Bytes: " + BitConverter.ToString(utf8Bytes));
        Console.WriteLine("UTF-16 Encoded Bytes: " + BitConverter.ToString(utf16Bytes));
        Console.WriteLine("ASCII Encoded Bytes: " + BitConverter.ToString(asciiBytes));
    }
}

輸出:

UTF-8 Encoded Bytes: 48-65-6C-6C-6F-2C-20-57-6F-72-6C-64-21
UTF-16 Encoded Bytes: 48-00-65-00-6C-00-6C-00-6F-00-2C-00-20-00-57-00-6F-00-72-00-6C-00-64-00-21-00
ASCII Encoded Bytes: 48-65-6C-6C-6F-2C-20-57-6F-72-6C-64-21

2)解碼:將字節(jié)數(shù)組轉(zhuǎn)換為字符串

// 使用 UTF-8 解碼
string decodedTextUTF8 = utf8Encoding.GetString(utf8Bytes);	//輸出:Hello, World!

// 使用 ASCII 解碼
string decodedTextASCII = asciiEncoding.GetString(asciiBytes);//輸出:Hello, World!

// 使用 Unicode 解碼
string decodedTextUnicode = unicodeEncoding.GetString(unicodeBytes);//輸出:Hello, World!

4. 編碼轉(zhuǎn)換操作

有時(shí)候,我們需要將一個(gè)編碼的字節(jié)數(shù)組轉(zhuǎn)換為另一個(gè)編碼的字節(jié)數(shù)組。這可以通過(guò)Encoding.Convert(源編碼,目標(biāo)編碼,源字節(jié)數(shù)組)方法實(shí)現(xiàn):

using System;
using System.Text;
class Program
{
    static void Main()
    {
        string originalText = "Hello, World!";
        // 將字符串編碼為UTF-8
        Encoding utf8 = Encoding.UTF8;
        byte[] utf8Bytes = utf8.GetBytes(originalText);
        
        Encoding utf16 = Encoding.Unicode;
        
        // 將UTF-8編碼的字節(jié)數(shù)組轉(zhuǎn)換為UTF-16
        byte[] utf16Bytes = Encoding.Convert(utf8, utf16, utf8Bytes);
        
        // 解碼UTF-16字節(jié)數(shù)組
        string convertedText = utf16.GetString(utf16Bytes);
        Console.WriteLine("Converted Text: " + convertedText);
    }
}

5. 實(shí)際應(yīng)用示例

1)示例1:編碼和解碼

以下是一個(gè)完整的示例,展示如何在 C# 中使用 System.Text.Encoding 類(lèi)進(jìn)行文本編碼和解碼操作。

using System;
using System.Text;

namespace EncodingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "Hello, World! 你好,世界!";

            // 獲取不同的編碼實(shí)例
            Encoding utf8Encoding = Encoding.UTF8;
            Encoding asciiEncoding = Encoding.ASCII;
            Encoding unicodeEncoding = Encoding.Unicode;

            // 將字符串編碼為字節(jié)數(shù)組
            byte[] utf8Bytes = utf8Encoding.GetBytes(text);
            byte[] asciiBytes = asciiEncoding.GetBytes(text);
            byte[] unicodeBytes = unicodeEncoding.GetBytes(text);

            // 輸出字節(jié)數(shù)組
            Console.WriteLine("UTF-8 編碼字節(jié)數(shù)組:");
            foreach (byte b in utf8Bytes)
            {
                Console.Write(b + " ");
            }
            Console.WriteLine();

            Console.WriteLine("ASCII 編碼字節(jié)數(shù)組:");
            foreach (byte b in asciiBytes)
            {
                Console.Write(b + " ");
            }
            Console.WriteLine();

            Console.WriteLine("Unicode 編碼字節(jié)數(shù)組:");
            foreach (byte b in unicodeBytes)
            {
                Console.Write(b + " ");
            }
            Console.WriteLine();

            // 將字節(jié)數(shù)組解碼為字符串
            string decodedTextUTF8 = utf8Encoding.GetString(utf8Bytes);
            string decodedTextASCII = asciiEncoding.GetString(asciiBytes);
            string decodedTextUnicode = unicodeEncoding.GetString(unicodeBytes);

            // 輸出解碼后的字符串
            Console.WriteLine("UTF-8 解碼字符串: " + decodedTextUTF8);
            Console.WriteLine("ASCII 解碼字符串: " + decodedTextASCII);
            Console.WriteLine("Unicode 解碼字符串: " + decodedTextUnicode);
        }
    }
}

2)示例2:編碼轉(zhuǎn)換

using System;
using System.Text;

public class EncodingDemo 
{
    public static void Main() 
    {
        // 示例:UTF-8 轉(zhuǎn) GBK
        string text = "編碼轉(zhuǎn)換測(cè)試";
        Encoding utf8 = Encoding.UTF8;
        Encoding gbk = Encoding.GetEncoding("GBK");

        byte[] utfBytes = utf8.GetBytes(text);
        byte[] gbkBytes = Encoding.Convert(utf8, gbk, utfBytes);

        string decodedText = gbk.GetString(gbkBytes);
        Console.WriteLine($"解碼結(jié)果:{decodedText}");
    }
}

三、高級(jí)用法

1. 實(shí)現(xiàn)自定義編碼

雖然.NET提供了多種內(nèi)置編碼,但有時(shí)我們可能需要自定義編碼。這可以通過(guò)繼承Encoding類(lèi)并重寫(xiě)其方法來(lái)實(shí)現(xiàn)。

2. 文件編碼處理

讀取文件時(shí)自動(dòng)檢測(cè)編碼(需結(jié)合 BOM 判斷):

public static Encoding DetectFileEncoding(string path) 
{
    byte[] bom = new byte[4];
    using (var file = new FileStream(path, FileMode.Open)) 
    {
        file.Read(bom, 0, 4);
    }
    if (bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF) return Encoding.UTF8;
    if (bom[0] == 0xFF && bom[1] == 0xFE) return Encoding.Unicode;
    return Encoding.Default; // 無(wú) BOM 時(shí)回退到默認(rèn)編碼
}

3. 網(wǎng)絡(luò)通信編碼

發(fā)送數(shù)據(jù)前統(tǒng)一編碼格式(推薦 UTF-8):

// 發(fā)送端
string message = "傳輸數(shù)據(jù)";
byte[] buffer = Encoding.UTF8.GetBytes(message);
socket.Send(buffer);

// 接收端
byte[] buffer = new byte[1024];
int bytesRead = socket.Receive(buffer);
string received = Encoding.UTF8.GetString(buffer, 0, bytesRead);

四、注意事項(xiàng)

1. 編碼選擇

在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體需求選擇合適的編碼方式。例如,處理中文文本時(shí),UTF-8 是一個(gè)不錯(cuò)的選擇。

2. 編碼兼容性

讀寫(xiě)文本時(shí)使用相同的編碼(如 UTF-8)。

在進(jìn)行編碼和解碼操作時(shí),必須確保使用相同的編碼方式,否則可能會(huì)導(dǎo)致數(shù)據(jù)丟失或亂碼。

internal class Program
{
    static void Main(string[] args)
    {
        string text = "Hello, 張三! ";
        // 使用UTF-8編碼
        byte[] utf8Bytes = Encoding.UTF8.GetBytes(text);

        // 但是使用 ASCII 解碼,會(huì)導(dǎo)致亂碼
        string decodedTextUTF8 = Encoding.ASCII.GetString(utf8Bytes);
        Console.WriteLine($"{decodedTextUTF8}");    //輸出:Hello, ??????!
    }
}

3. 性能考慮

不同的編碼方式在性能上可能會(huì)有所不同,應(yīng)根據(jù)實(shí)際情況進(jìn)行優(yōu)化。

4. 跨平臺(tái)開(kāi)發(fā)

  • Encoding.Default 依賴(lài)系統(tǒng)區(qū)域設(shè)置(如 Windows 中的 GBK 或 CP1252),可能導(dǎo)致跨平臺(tái)問(wèn)題。避免使用 Encoding.Default,推薦統(tǒng)一使用 UTF-8 (國(guó)際化、兼容性最佳)。
  • 在 Linux/macOS 中,路徑分隔符和編碼默認(rèn)值可能與 Windows 不同。

5. 處理舊系統(tǒng)的代碼頁(yè)編碼

  • 使用 CodePagesEncodingProvider(需引用 System.Text.Encoding.CodePages 包):
    EncodingProvider provider = CodePagesEncodingProvider.Instance;
    Encoding.RegisterProvider(provider);
    Encoding gbk = Encoding.GetEncoding("GBK"); // 現(xiàn)在可訪(fǎng)問(wèn) GBK
    

結(jié)語(yǔ)

到此這篇關(guān)于C# System.Text.Encoding使用小結(jié)的文章就介紹到這了,更多相關(guān)C# System.Text.Encoding使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

參考資料:

相關(guān)文章

最新評(píng)論

山阴县| 蚌埠市| 阿荣旗| 泰安市| 乾安县| 怀安县| 洛阳市| 宝兴县| 玉门市| 邯郸市| 泰安市| 临湘市| 巧家县| 安西县| 都匀市| 临桂县| 新竹市| 石嘴山市| 饶河县| 天台县| 内江市| 城口县| 二手房| 探索| 错那县| 江源县| 浪卡子县| 南开区| 天镇县| 凤翔县| 汤阴县| 浦东新区| 石柱| 山西省| 托克逊县| 沂水县| 文水县| 西峡县| 科技| 廉江市| 吉安市|