You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中读取包含中文和越南语的TXT文件?

在C#中同时读取包含中文和越南语的TXT文件解决方案

问题本质是文本文件编码与StreamReader使用的编码不匹配:

  • Encoding.Default是系统默认编码(如中文系统多为GBK/GB2312),仅支持有限字符集,无法解析越南语特殊字符;
  • 无参数StreamReader会自动检测编码,但如果文件编码不是UTF-8或检测失败,会导致中文乱码。

解决方案

要同时兼容两种语言,核心是使用Unicode系列编码(首选UTF-8),以下是具体实现:

1. 明确指定UTF-8编码读取

如果文件以UTF-8编码保存(带BOM或不带BOM均可),直接指定编码即可:

using (StreamReader reader = new StreamReader(filename, Encoding.UTF8))
{
    string fullContent = reader.ReadToEnd();
    // 处理读取内容
}

若文件是UTF-8无BOM格式,无参数StreamReader可能误判编码,此时明确指定Encoding.UTF8可解决问题。

2. 自动检测文件编码读取

不确定文件编码时,可通过检测文件头BOM标识判断编码:

using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    Encoding targetEncoding = Encoding.Default;
    byte[] bomBuffer = new byte[4];
    int readBytes = fs.Read(bomBuffer, 0, 4);

    // 根据BOM判断编码
    if (readBytes >= 3 && bomBuffer[0] == 0xEF && bomBuffer[1] == 0xBB && bomBuffer[2] == 0xBF)
    {
        targetEncoding = Encoding.UTF8;
    }
    else if (readBytes >= 2)
    {
        if (bomBuffer[0] == 0xFF && bomBuffer[1] == 0xFE)
        {
            targetEncoding = Encoding.Unicode; // UTF-16小端
        }
        else if (bomBuffer[0] == 0xFE && bomBuffer[1] == 0xFF)
        {
            targetEncoding = Encoding.BigEndianUnicode; // UTF-16大端
        }
    }

    // 回到文件起始位置
    fs.Seek(0, SeekOrigin.Begin);
    using (StreamReader reader = new StreamReader(fs, targetEncoding))
    {
        string fullContent = reader.ReadToEnd();
        // 处理读取内容
    }
}

3. 从源头上规范文件编码

将TXT文件以UTF-8编码保存(如用记事本保存时选择“UTF-8”或“UTF-8 with BOM”),后续用Encoding.UTF8读取即可完美兼容中文和越南语。

内容的提问来源于stack exchange,提问作者joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:03:35