wordpress 获取链接,广州 seo的网站,快递网站怎么制作,如何选择企业网站开发总目录 前言
在C#编程中#xff0c;处理字符串和字节数组之间的转换是一个常见的任务。System.Text.Encoding类及其派生类提供了丰富的功能#xff0c;帮助开发者实现不同字符编码之间的转换。本文将详细讲解System.Text.Encoding类的使用方法#xff0c;包括常用编码的介绍…总目录 前言
在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-212解码将字节数组转换为字符串
// 使用 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 类