C# System.Text.Encoding 使用詳解

總目錄


前言

在C#編程中,處理字符串和字節數組之間的轉換是一個常見的任務。System.Text.Encoding類及其派生類提供了豐富的功能,幫助開發者實現不同字符編碼之間的轉換。本文將詳細講解System.Text.Encoding類的使用方法,包括常用編碼的介紹、編碼和解碼的基本操作、以及一些高級用法。


一、基礎概念

1. 什么是字符編碼?

字符編碼是將字符(如字母、數字、符號等)轉換為字節序列的規則。不同的字符編碼標準(如ASCII、UTF-8、UTF-16等)定義了不同的映射規則。在計算機中,字符編碼用于存儲、傳輸和顯示文本數據。

2. 常見的字符編碼

常見的字符編碼包括:

  • ASCII:美國信息交換標準代碼,使用 7 位二進制數表示 128 個字符。
    • 特點:固定 1 字節,僅支持 0x00-0x7F(英文字符)。
    • 適用場景:純英文文本。
    • 注意:若包含非 ASCII 字符(如中文),會替換為 ? 或拋出異常
  • UTF-8:一種變長的字符編碼,可以表示 Unicode 中的所有字符,兼容 ASCII。
    • 特點:可變長度編碼,1-4 字節表示一個字符,兼容 ASCII。
    • 適用場景:國際化文本、網頁、網絡傳輸(HTTP/JSON)。
  • Unicode:一種定長的字符編碼,使用 2 個字節表示一個字符。
    • 特點:固定 2 字節(小端序或大端序),支持基本 Unicode 字符。
    • 適用場景:內存中存儲(如 .NET 的 string 類型)。
  • GB2312/GBK/GB18030:中文編碼(需通過 Encoding.GetEncoding 獲取)。

3. 編碼與解碼

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

4. System.Text.Encoding 類概述

System.Text.Encoding類是.NET框架中用于處理字符編碼的基類(核心類)。它提供了將字符串轉換為字節數組(編碼)和將字節數組轉換為字符串(解碼)的方法。Encoding類本身是抽象的,不能直接實例化,但提供了多個派生類,每個派生類對應一種特定的字符編碼。

5. Encoding 類核心功能

  • 支持多種編碼格式(如 UTF-8、ASCII、Unicode 等)。
  • 實現字符串與字節數組的雙向轉換。
  • 兼容跨平臺和多語言場景。

3. 常用方法與屬性

1)核心方法

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

2)靜態屬性

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

3)常用字符編碼類

以下是一些常用的字符編碼類及其對應的編碼標準:

字符編碼類對應的編碼標準
ASCIIEncoding對應ASCII編碼,支持7位字符。
UTF7Encoding對應UTF-7編碼,一種基于7位的Unicode編碼。
UTF8Encoding對應UTF-8編碼,廣泛用于互聯網的多字節Unicode編碼。
UnicodeEncoding對應UTF-16編碼,使用兩個字節表示大多數字符。
ASCIIEncoding對應ASCII編碼,支持7位字符。

二、使用

1. 獲取編碼實例

using System.Text;// 獲取 UTF-8 編碼實例
Encoding utf8Encoding = Encoding.UTF8;// 獲取 ASCII 編碼實例
Encoding asciiEncoding = Encoding.ASCII;// 獲取 Unicode 編碼實例
Encoding unicodeEncoding = Encoding.Unicode;// 通過GetEncoding 獲取 GB2312 編碼實例
Encoding gb2312 = Encoding.GetEncoding("GB2312");// 獲取 GBK 編碼(代碼頁 936)
Encoding gbk = Encoding.GetEncoding(936);// 列出所有支持的編碼
foreach (EncodingInfo ei in Encoding.GetEncodings())
{Console.WriteLine($"名稱: {ei.Name}, 描述: {ei.DisplayName}");
}

2. 獲取編碼信息

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

3. 編碼和解碼操作

注意:若使用 Encoding.Default(系統默認編碼,如中文環境下的 GB2312),可能導致跨平臺亂碼,推薦顯式指定編碼。

1)編碼:將字符串轉換為字節數組

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)解碼:將字節數組轉換為字符串

// 使用 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. 編碼轉換操作

有時候,我們需要將一個編碼的字節數組轉換為另一個編碼的字節數組。這可以通過Encoding.Convert(源編碼,目標編碼,源字節數組)方法實現:

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

8. 實際應用示例

1)示例1:編碼和解碼

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

using System;
using System.Text;namespace EncodingExample
{class Program{static void Main(string[] args){string text = "Hello, World! 你好,世界!";// 獲取不同的編碼實例Encoding utf8Encoding = Encoding.UTF8;Encoding asciiEncoding = Encoding.ASCII;Encoding unicodeEncoding = Encoding.Unicode;// 將字符串編碼為字節數組byte[] utf8Bytes = utf8Encoding.GetBytes(text);byte[] asciiBytes = asciiEncoding.GetBytes(text);byte[] unicodeBytes = unicodeEncoding.GetBytes(text);// 輸出字節數組Console.WriteLine("UTF-8 編碼字節數組:");foreach (byte b in utf8Bytes){Console.Write(b + " ");}Console.WriteLine();Console.WriteLine("ASCII 編碼字節數組:");foreach (byte b in asciiBytes){Console.Write(b + " ");}Console.WriteLine();Console.WriteLine("Unicode 編碼字節數組:");foreach (byte b in unicodeBytes){Console.Write(b + " ");}Console.WriteLine();// 將字節數組解碼為字符串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:編碼轉換

using System;
using System.Text;public class EncodingDemo 
{public static void Main() {// 示例:UTF-8 轉 GBKstring text = "編碼轉換測試";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($"解碼結果:{decodedText}");}
}

三、高級用法

1. 實現自定義編碼

雖然.NET提供了多種內置編碼,但有時我們可能需要自定義編碼。這可以通過繼承Encoding類并重寫其方法來實現。

2. 文件編碼處理

讀取文件時自動檢測編碼(需結合 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; // 無 BOM 時回退到默認編碼
}

3. 網絡通信編碼

發送數據前統一編碼格式(推薦 UTF-8):

// 發送端
string message = "傳輸數據";
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);

四、注意事項

1. 編碼選擇

在實際應用中,應根據具體需求選擇合適的編碼方式。例如,處理中文文本時,UTF-8 是一個不錯的選擇。

2. 編碼兼容性

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

在進行編碼和解碼操作時,必須確保使用相同的編碼方式,否則可能會導致數據丟失或亂碼。

internal class Program
{static void Main(string[] args){string text = "Hello, 張三! ";// 使用UTF-8編碼byte[] utf8Bytes = Encoding.UTF8.GetBytes(text);// 但是使用 ASCII 解碼,會導致亂碼string decodedTextUTF8 = Encoding.ASCII.GetString(utf8Bytes);Console.WriteLine($"{decodedTextUTF8}");    //輸出:Hello, ??????!}
}

3. 性能考慮

不同的編碼方式在性能上可能會有所不同,應根據實際情況進行優化。

4. 跨平臺開發

  • Encoding.Default 依賴系統區域設置(如 Windows 中的 GBK 或 CP1252),可能導致跨平臺問題。避免使用 Encoding.Default,推薦統一使用 UTF-8 (國際化、兼容性最佳)。
  • 在 Linux/macOS 中,路徑分隔符和編碼默認值可能與 Windows 不同。

5. 處理舊系統的代碼頁編碼

  • 使用 CodePagesEncodingProvider(需引用 System.Text.Encoding.CodePages 包):
    EncodingProvider provider = CodePagesEncodingProvider.Instance;
    Encoding.RegisterProvider(provider);
    Encoding gbk = Encoding.GetEncoding("GBK"); // 現在可訪問 GBK
    

結語

回到目錄頁:C#/.NET 知識匯總、C# 上位機知識匯總
希望以上內容可以幫助到大家,如文中有不對之處,還請批評指正。


參考資料:

  • 微軟官方文檔:Encoding 類

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899162.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pre-flash和Main flash

在相機拍照過程中,Pre-flash(預閃光) 和 Main flash(主閃光) 是常見的兩種閃光燈使用模式,通常用于提高低光環境下的拍攝質量,尤其在自動曝光(AE)和自動對焦(…

Kafka 4.0 發布:KRaft 替代 Zookeeper、新一代重平衡協議、點對點消息模型、移除舊協議 API

KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一個重要的里程碑,標志著第一個完全無需 Apache ZooKeeper 運行的主要版本。 通過默認運行在 KRaft 模式下,Kafka 簡化了部署和管理,消除了維護單獨 ZooKeeper 集群的復雜性。 這一變化顯著降…

SFT實驗報告

大模型微調實驗報告* 實驗目標 梳理大模型微調方法,評估各種基座和微調方法的實驗效果。 基礎模型 \1.Llama \2.Qwen \3.Chatglm4 \4. 微調策略 LoRA系列 低秩適配(LoRA)的核心思想是凍結原始參數,通過低秩分解引入可訓…

LLM - R1 強化學習 DRPO 策略優化 DAPO 與 Dr. GRPO 算法 教程

歡迎關注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/146533892 在強化學習算法中,DAPO (Decoupled Clip and Dynamic Sampling Policy Optimization),通過解耦裁剪和動態采樣策…

美攝科技智能汽車視頻延遲攝影解決方案,開啟智能出行新視界

在智能汽車時代,車載影像技術正以前所未有的速度發展,成為提升駕乘體驗和滿足用戶多樣化需求的關鍵因素。美攝科技憑借其卓越的技術實力和創新精神,推出了智能汽車視頻延遲攝影解決方案,為智能汽車行業帶來了一場視覺盛宴。 一、…

[250325] Claude AI 現已支持網絡搜索功能!| ReactOS 0.4.15 發布!

目錄 Claude AI 現已支持網絡搜索功能!ReactOS 0.4.15 發布! Claude AI 現已支持網絡搜索功能! 近日,Anthropic 公司宣布,其 AI 助手 Claude 現在可以進行網絡搜索,為用戶提供更及時、更相關的回復。這項新…

代碼規范之Variable Names變量名

代碼規范之Variable Names變量名 golang中 官方文檔:https://go.dev/wiki/CodeReviewComments#variable-names Variable names in Go should be short rather than long. This is especially true for local variables with limited scope. Prefer c to lineCoun…

Mybatis_plus

前言 Mybatis_plus 是在 mybatis 的基礎上進行了增強,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。本文章只做簡單的使用介紹,更加詳細的內容大家可以參考官網。 下面是mybatis_plus 官網地址: mybatis_plu…

深圳問頂安全科技有限公司asktopsec是做什么的?

深圳問頂安全科技有限公司,是一家專業的AI與應用安全公司。 全球領先的AI、Android、IOS應用安全解決方案提供商,官網:https://asktopsec.com 問頂安全主要為企業提供AI和應用安全服務 移動應用安全檢測、移動應用安全加固、AI智能體安全、AI…

鴻蒙OS 5 架構設計探秘:從分層設計到多端部署

文章目錄 鴻蒙OS架構設計探秘:從分層設計到多端部署一、鴻蒙的分層架構設計二、模塊化設計的精髓三、智慧分發設計:資源的動態調度四、一次開發,多端部署的實踐總結與思考 鴻蒙OS架構設計探秘:從分層設計到多端部署 最近兩年來&a…

idea 沒有 add framework support(添加框架支持)選項

在 IntelliJ IDEA 2023 中,若需通過設置手動添加 “添加框架支持” 菜單項,可按照以下步驟操作: 手動添加 “添加框架支持” 菜單項 打開設置 點擊頂部菜單欄的 File(文件) -> Settings(設置&#xff09…

計算機網絡--傳輸層(2)

傳輸層核心機制深度解析 一、可靠傳輸實現機制 1. 校驗和機制 技術原理: 使用16位二進制反碼求和算法,計算范圍包括TCP偽首部(12字節)、TCP首部(20字節)和數據部分接收端重新計算校驗和,若與…

再探帶權并查集

典型例題 Acwing 權值 故名思義,在帶權并查集中,我們需要讓每個節點攜帶一個**“權值”**。 那么這個權值應該是什么呢?其實答案就在并查集當中。 由于在并查集當中我們可以在 O ( 1 ) O(1) O(1) 時間內找到一個節點的根節點,那…

Vala編成語言教程-構造函數和析構函數

構造函數 Vala支持兩種略有不同的構造方案:我們將重點討論Java/C#風格的構造方案,另一種是GObject風格的構造方案。 Vala不支持構造函數重載的原因與方法重載不被允許的原因相同,這意味著一個類不能有多個同名構造函數。但這并不構成問題&…

本地部署Stable Diffusion生成爆火的AI圖片

直接上代碼 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

python爬蟲WASM

WASM 一.WASM簡介 1.1 WASM定義 ? WebAssembly(簡稱wasm)是一個虛擬指令集體系架構(virtual ISA),整體架構包括核心的ISA定義、二進制編碼、程序語義的定義與執行,以及面向不同的嵌入環境(如Web)的應用編程接口(WebAssembly API)。是一種運行在現代網絡瀏覽器中的…

Docker鏡像遷移方案

Docker鏡像遷移方案 文章目錄 Docker鏡像遷移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;異常原因參考&#xff1a; 一&#xff1a;背景 比如機器上已經有先有的容器&#xff0c;但是docker pull的時候是失敗的二&#xff1a;操作方式 1、停止正在運行的容器…

關于跨域問題(本地前端訪問服務器端接口跨域出錯)

問題來源&#xff1a; 當服務器封裝了接口但是本地電腦端前端訪問出現跨域問題。 解決方案&#xff1b; 1、使用ipconfig 查看本地電腦的ip地址 ipconfig 2、在后端接口處配置如下代碼 allow_origins["http://本地ip地址:3001", # 局域網內其他設備訪問的本地…

邊緣計算 vs. 云計算,誰才是工業物聯網的未來?

前言 在物聯網&#xff08;IoT&#xff09;飛速發展的今天&#xff0c;邊緣計算正在徹底改變數據的處理、存儲和分析方式。傳統的IoT設備數據通常需要發送到云端進行處理&#xff0c;但隨著設備數量的激增&#xff0c;這種模式在延遲、帶寬和安全性方面暴露出諸多局限。邊緣計…

dell 臺式機 電腦 紐扣電池 如何取下?

dell 臺式機 電腦 紐扣電池 如何取下&#xff1f; 戴爾-optiplex-3060-塔式機-服務手冊