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

File.ReadLines读取字符间含空字符的原因及解决方法

为什么File.ReadLines会读出带\0的字符串?怎么直接获取正确内容?

兄弟,我太懂你这种困惑了!你看到的"T\0e\0s\0t\0"这种结果,核心原因是文件的实际编码和File.ReadLines默认使用的编码不匹配。

问题根源

你的文件是用UTF-16(Unicode)编码保存的。这种编码里,像'T'、'e'这类ASCII字符会被存储为两个字节:字符本身的字节 + 一个空字节(\0)。而File.ReadLines方法默认会用UTF-8编码去解析文件内容,当它读取UTF-16的字节流时,就会把每个字符后面的空字节当成独立的字符读出来,于是就出现了这种夹着\0的奇怪字符串。

直接解决方法:指定正确的编码

要让ReadLines直接读出正常的"Test",只需要在调用方法时显式指定文件的编码为UTF-16(.NET里对应Encoding.Unicode)即可:

// 显式指定编码为UTF-16
var readLines = File.ReadLines(file, Encoding.Unicode);
foreach (var line in readLines)
{
    // 现在line就是正常的"Test"了
    Console.WriteLine(line);
}

额外小技巧:自动检测编码(如果不确定编码时)

如果你不确定文件到底用了什么编码,可以用Encoding.DetectEncodingFromByteOrderMarks方法尝试自动检测(前提是文件带有BOM字节顺序标记),代码示例如下:

using (var stream = new FileStream(file, FileMode.Open))
{
    // 尝试从字节流检测编码
    var encoding = Encoding.DetectEncodingFromByteOrderMarks(stream);
    // 如果检测不到, fallback到你认为合适的编码(比如UTF-8)
    encoding ??= Encoding.UTF8;
    
    var readLines = File.ReadLines(file, encoding);
    foreach (var line in readLines)
    {
        Console.WriteLine(line);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:27:53