如何在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
相关产品推荐
相关产品推荐

