一、基本概念
System.Text.Encoding
是 C# 中处理字符编码与转换的核心类,核心作用是:
-
建立字符串(字符序列) 与字节数组(二进制数据) 之间的转换桥梁
-
实现不同编码格式(如 UTF-8、ASCII 等)的映射规则,解决 "人类可识别字符" 与 "计算机存储的二进制" 之间的转换问题
二、常用编码格式及区别
编码格式 | 特点 | 适用场景 |
---|---|---|
Encoding.ASCII |
仅支持 0-127 范围字符(英文、数字、基础符号),超出范围替换为? |
纯英文场景(如早期协议) |
Encoding.UTF8 |
可变长度(1-4 字节),支持全球所有字符,兼容 ASCII,空间高效 | 多语言文本、网络传输(HTTP/JSON)、文件存储 |
Encoding.Unicode |
固定 2 字节(UTF-16 Little-Endian),支持所有字符,Windows 系统常用 | Windows 本地文件、.NET 内部字符串(部分场景) |
Encoding.UTF32 |
固定 4 字节,支持所有字符,空间占用大 | 需固定长度编码的特殊场景 |
三、核心方法(转换操作)
1. 字符串 → 字节数组(编码)
-
基础方法 :
GetBytes(string s)
例:byte[] utf8Bytes = Encoding.UTF8.GetBytes("你好");
(中文 "你好" 在 UTF-8 中占 6 字节) -
重载方法 :
GetBytes(string s, int index, int count, byte[] bytes, int byteIndex)
作用:仅转换字符串的部分内容(从index
开始,取count
个字符),并写入目标字节数组的byteIndex
位置,适合大数据处理(减少临时数组)
2. 字节数组 → 字符串(解码)
-
基础方法 :
GetString(byte[] bytes)
例:string str = Encoding.UTF8.GetString(utf8Bytes);
-
重载方法 :
GetString(byte[] bytes, int index, int count)
作用:仅解码字节数组的部分内容(从index
开始,取count
个字节)
3. 获取指定编码
Encoding.GetEncoding(string name)
:通过编码名称获取对象(名称不区分大小写) 例:Encoding gbk = Encoding.GetEncoding("GBK");
(.NET Core 需额外安装支持包)
四、避坑要点:为什么会乱码?
-
本质:编码和解码使用了不同的规则(如 UTF8 编码的字节用 ASCII 解码)。
-
解决原则:编码与解码必须使用同一种规则。
五、实际场景示例
1. 网络通信(确保跨系统一致性)
// 发送方:字符串→UTF8字节
string sendText = "Hello,世界";
byte[] sendBytes = Encoding.UTF8.GetBytes(sendText);
// 接收方:UTF8字节→字符串
byte[] receiveBytes = ...; // 从网络接收的字节
string receiveText = Encoding.UTF8.GetString(receiveBytes);
2. 文件读写(匹配文件编码)
// 写入UTF8编码文件(无BOM)
string content = "中文内容";
byte[] fileBytes = Encoding.UTF8.GetBytes(content);
File.WriteAllBytes("file.txt", fileBytes);
// 读取时用相同编码
byte[] readBytes = File.ReadAllBytes("file.txt");
string readContent = Encoding.UTF8.GetString(readBytes);
3. 多编码转换(如 GBK→UTF8)
// 假设bytes是GBK编码的字节
byte[] gbkBytes = ...;
// 步骤1:用GBK解码为字符串
string text = Encoding.GetEncoding("GBK").GetString(gbkBytes);
// 步骤2:用UTF8重新编码为字节
byte[] utf8Bytes = Encoding.UTF8.GetBytes(text);
总结
Encoding
类是 "字符 - 字节" 转换的 "翻译官",核心价值在于多语言、跨平台、跨系统场景中确保数据正确传递。
-
优先使用
UTF8
(兼容性最强); -
避免依赖系统默认编码(不同系统默认编码可能不同)