C#字符集编码使用与UTF-8和GBK互相转换代码

小岛来信
小岛来信
发布时间:2026-10-15| 5人浏览过
原创

本文讲解 C# 常用的字符集(ASCII、GB系列、Unicode)及其区别,并解决在较新版本 .NET 中使用 GBK/GB2312 编码时的兼容性问题。提供 UTF-8 与 GBK 互相转换的完整实现方法及关键注意事项。

C#常用字符集编码说明

在进行文本处理前,了解不同编码体系的基本特性是必要的:

  • ASCII:标准西欧字符集,基于7位二进制,涵盖基本英文字母和符号。
  • GB2312:国家简体中文字符集,兼容 ASCII,主要收录简体中文常用字。
  • BIG5:主要用于繁体中文地区的统一繁体字编码。
  • GBK:GB2312 的扩展版本,不仅支持简体中文,也包含部分繁体字,完全向下兼容 GB2312。
  • GB18030:国家最新强制标准,在 GBK 基础上进一步扩展了生僻字以及日文、朝鲜语等字符,兼容 GBK。
  • UNICODE (UTF-8):旨在为全球所有语言提供统一编码标准。注意,标准的 Unicode 实现仅兼容 ASCII,对于 GB 系列编码并不直接兼容,因此在跨编码交互时需要显式转换。

UTF-8 与 GBK/GB2312 互转核心代码

在实际开发中,UTF-8 与 GBK/GB2312 之间的相互转换是最常见的操作。将 GB2312 替换为 GBK 即可用于对应的编码类型。

第1步:添加必要的命名空间引用

首先需要确保引入系统文本处理命名空间:

using System.Text;

第2步:注册编码提供商(.NET Core/.NET 5+ 必备)

这是一个关键的注意事项。在使用 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 之前,必须理解其背景:

在传统的 .NET Framework 中,所有编码页均直接可用。但在 .NET Core / .NET 5+ 环境中,为了精简框架体积,默认移除了对许多非通用编码(如 GBK、ISO-8859-1 等)的支持。若未进行注册直接调用 Encoding.GetEncoding("gbk"),程序会抛出异常:

因此,在执行任何涉及传统 Windows 编码(Code Page)的操作前,务必调用上述注册语句。

第3步:编写转换函数

以下是经过验证的互转逻辑,利用了 Encoding.Convert 方法进行底层字节流转换:

public static string UTF8ToGBK(string text)
{
    // 必须在调用 GetEncoding 前注册
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    try
    {
        Encoding utf8 = Encoding.UTF8;
        Encoding gbk = Encoding.GetEncoding("gbk"); 
        // 注:也可使用 Encoding.Default (通常对应 936 即 GBK),但建议显式指定
        
        byte[] temp = utf8.GetBytes(text);
        byte[] temp1 = Encoding.Convert(utf8, gbk, temp);
        string result = gbk.GetString(temp1);
        return result;
    }
    catch
    {
        return null; // 或者记录日志后返回原字符串
    }
}

public static string GBKToUTF8(string str)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    
    Encoding utf8 = Encoding.GetEncoding("utf-8");
    Encoding gbk = Encoding.GetEncoding("gbk");
    
    byte[] gb = gbk.GetBytes(str);
    gb = Encoding.Convert(gbk, utf8, gb);
    
    return utf8.GetString(gb);
}

第4步:辅助功能:获取十六进制编码值

如果需要以十六进制形式查看特定编码下的字节值,可以使用以下方法:

public static int GetGBKValue(string key)
{
    // 获取目标编码的字节数组
    byte[] gbk = Encoding.GetEncoding("GBK").GetBytes(key);
    // 或:byte[] gbk = Encoding.UTF8.GetBytes(key);
    
    string code = "";
    foreach (byte b in gbk)
    {
        code += string.Format("{0:X2}", b);
    }
    
    // 尝试解析为整数(注意:过长的字符串会导致溢出,此法适合短测试)
    if (int.TryParse(code, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int value))
    {
        return value;
    }
    return -1;
}

以上就是 C# 字符集编码的使用及 UTF-8 与 GBK 互相转换的详细内容,更多关于 C# 数据处理和编码转换的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。