1. 首页
  2. 编程语言
  3. C#
  4. C#GB2312与UTF-8编码格式互转详解

C#GB2312与UTF-8编码格式互转详解

上传者: 2025-05-31 15:47:36上传 ZIP文件 10.98KB 热度 2次

多语言项目里老绕不开编码问题,尤其你跟中文文本打交道多了就更。GB2312UTF-8UTF-8-BOM这些编码格式,看着像亲戚,实则脾气都不一样,转换起来要注意不少细节。

搞 C#的你,遇到乱码、文件打不开、传过去别人说看不懂?嗯,多半就是编码没转好。用System.Text.Encoding搞定这些转换,其实还挺,关键是理解每种编码的“个性”。

GB2312主要管的是简体中文,一个汉字两个字节,偏传统但还挺常见。UTF-8灵活得多,英文一字节,中文看情况,网络上最流行的就是它。至于UTF-8-BOM,多了个 BOM 头,主要是让程序知道“我是 UTF-8”,不过也有程序不认这个,反而出问题。

你要是用 C#做编码转换,下面这些代码片段可以直接用:

// GB2312 转 UTF-8
string gb2312String = "GBK 编码的字符串";
byte[] gb2312Bytes = Encoding.GetEncoding("gb2312").GetBytes(gb2312String);
string utf8String = Encoding.UTF8.GetString(gb2312Bytes);

// UTF-8 转 GB2312
string utf8String = "UTF-8 编码的字符串";
byte[] utf8Bytes = Encoding.UTF8.GetBytes(utf8String);
string gb2312String = Encoding.GetEncoding("gb2312").GetString(utf8Bytes);

还有带 BOM 的文件的办法,一开头先检查有没有 BOM,有的话先跳过再读文件内容:

using (FileStream fileStream = new FileStream("带有 BOM 的 UTF8File.txt", FileMode.Open)) {
  byte[] bom = new byte[3];
  fileStream.Read(bom, 0, bom.Length);
  if (bom.SequenceEqual(Encoding.UTF8.GetPreamble())) {
    fileStream.Position = bom.Length;
  }
  byte[] allBytes = new byte[fileStream.Length - bom.Length];
  fileStream.Read(allBytes, 0, allBytes.Length);
  string textWithoutBom = Encoding.UTF8.GetString(allBytes);
  string gb2312String = Encoding.GetEncoding("gb2312").GetString(allBytes);
}

复杂点的比如用Stream读写文件再转换编码,也没多难:

using (FileStream inputStream = new FileStream("inputFile.gb2312", FileMode.Open))
using (FileStream outputStream = new FileStream("outputFile.utf8", FileMode.Create)) {
  var gb2312Encoder = Encoding.GetEncoding("gb2312").GetEncoder();
  var utf8Encoder = Encoding.UTF8.GetEncoder();
  byte[] inputBuffer = new byte[inputStream.Length];
  inputStream.Read(inputBuffer, 0, inputBuffer.Length);
  char[] chars = new char[gb2312Encoder.GetCharCount(inputBuffer, 0, inputBuffer.Length)];
  gb2312Encoder.GetChars(inputBuffer, 0, inputBuffer.Length, chars, 0);
  byte[] outputBuffer = new byte[utf8Encoder.GetByteCount(chars, 0, chars.Length)];
  utf8Encoder.GetBytes(chars, 0, chars.Length, outputBuffer, 0);
  outputStream.Write(outputBuffer, 0, outputBuffer.Length);
}

如果你平时要中文文档、导出报表、生成静态文件啥的,这些转换技巧就用得上。哦对了,工具类的朋友也不少,像:

如果你正好在跟编码打交道,建议收藏一下,有备无患。

下载地址
用户评论