C# System.Text.Encoding使用小結(jié)
前言
在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.ASCII | ASCII 編碼(代碼頁(yè) 20127) | 僅支持英文字符(0x00-0x7F)。 |
| Encoding.UTF8 | UTF-8 編碼(代碼頁(yè) 65001) | 國(guó)際化文本(支持所有 Unicode 字符)。 |
| Encoding.Unicode | UTF-16 小端序(代碼頁(yè) 1200) | 內(nèi)部存儲(chǔ)(如 .NET 的 char 類(lèi)型)。 |
| Encoding.UTF32 | UTF-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)文章希望大家以后多多支持腳本之家!
參考資料:
- C#編程報(bào)錯(cuò)System.InvalidOperationException問(wèn)題及解決
- C#利用System.Uri轉(zhuǎn)URL為絕對(duì)地址的方法
- c#遍歷System.drawing.Color下面的所有顏色以及名稱(chēng)以查看
- C#關(guān)于System.Collections空間詳解
- C#利用System.Threading.Thread.Sleep即時(shí)輸出信息的詳解
- C#串口編程System.IO.Ports.SerialPort類(lèi)
- C#命名空間System.ComponentModel屬性方法匯總
- c#基礎(chǔ)系列之System.String的深入理解
- C# 添加對(duì)System.Configuration.dll文件的引用操作
- C# System.BadImageFormatException問(wèn)題及解決
相關(guān)文章
C#實(shí)現(xiàn)基于鏈表的內(nèi)存記事本實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)基于鏈表的內(nèi)存記事本,實(shí)例分析了C#基于鏈表實(shí)現(xiàn)的記事本功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C# AvaloniaUI資源找不到報(bào)錯(cuò)的解決方案
這篇文章主要介紹了AvaloniaUI資源找不到錯(cuò)誤排查與解決,涵蓋資源未正確定義、路徑錯(cuò)誤及資源字典未合并等常見(jiàn)問(wèn)題,時(shí)調(diào)試與錯(cuò)誤處理示例,助您高效解決資源加載問(wèn)題,需要的朋友可以參考下2026-06-06
c#封裝百度web服務(wù)geocoding api 、百度坐標(biāo)轉(zhuǎn)換示例
這篇文章主要介紹了c#封裝百度Web服務(wù)geocoding api 、百度坐標(biāo)轉(zhuǎn)換,需要的朋友可以參考下2014-04-04
深入多線(xiàn)程之:用Wait與Pulse模擬一些同步構(gòu)造的應(yīng)用詳解
本篇文章是對(duì)用Wait與Pulse模擬一些同步構(gòu)造的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#定義簡(jiǎn)單的反射工廠(chǎng)實(shí)例分析
這篇文章主要介紹了C#定義簡(jiǎn)單的反射工廠(chǎng)的用法,實(shí)例分析了反射工廠(chǎng)的原理與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
C#通過(guò)oledb訪(fǎng)問(wèn)access數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C#通過(guò)oledb訪(fǎng)問(wèn)access數(shù)據(jù)庫(kù)的方法,實(shí)例分析了C#操作access數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下2015-06-06

