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

