C# 为什么字节150在记事本中显示为破折号,但在我按程序阅读时却不显示?
我有一个文件在记事本(和记事本++)中看起来不错,但当我试图用C#程序读取它时,破折号显示为替换字符(�) 相反,经过一些尝试和错误,我可以复制错误如下:C# 为什么字节150在记事本中显示为破折号,但在我按程序阅读时却不显示?,c#,text,C#,Text,我有一个文件在记事本(和记事本++)中看起来不错,但当我试图用C#程序读取它时,破折号显示为替换字符(�) 相反,经过一些尝试和错误,我可以复制错误如下: File.WriteAllBytes("C:\\Misc\\CharTest\\wtf.txt", new byte[] { 150 }); var readFile = File.ReadAllText("C:\\Misc\\CharTest\\wtf.txt&q
File.WriteAllBytes("C:\\Misc\\CharTest\\wtf.txt", new byte[] { 150 });
var readFile = File.ReadAllText("C:\\Misc\\CharTest\\wtf.txt");
Console.WriteLine(readFile);
现在,如果你用记事本查看wtf.txt文件,你会看到一个破折号…但我不明白。我知道这不是一个“真实”的Unicode值,所以这可能是问题的根源,但我不明白为什么它在记事本中看起来很好,而在我读取文件时却不好。我如何让文件以破折号的形式读取它
另一方面,我试图用C语言重写的VB6程序也将其读取为破折号。文件.ReadAllText(string)重载,其中值为150的独立字节无效
指定文件的实际编码,例如:
var encoding=encoding.GetEncoding(1252);
字符串内容=File.ReadAllText(文件名,编码);
我使用了编码,在代码点150处有一个破折号
编辑:记事本正确显示文件,因为对于非Unicode文件,Windows-1252代码页是西部地区设置的默认值。因此,您也可以使用
编码。默认值为以获得正确的结果,但请记住编码。默认值为可以返回具有不同注册表的不同代码页独立设置。文件.ReadAllText(string)
重载,其中值为150的独立字节无效
指定文件的实际编码,例如:
var encoding=encoding.GetEncoding(1252);
字符串内容=File.ReadAllText(文件名,编码);
我使用了编码,在代码点150处有一个破折号
编辑:记事本正确显示文件,因为对于非Unicode文件,Windows-1252代码页是西部地区设置的默认值。因此,您也可以使用编码。默认值为以获得正确的结果,但请记住编码。默认值为可以返回具有不同注册表的不同代码页全国设置。您正在文本文件中写入字节。您正在读取这些字节并将其解释为字符。
现在,当您写入字节时,您不需要考虑编码,而必须这样做,以便读取与char相同的字节
记事本++似乎将字节解释为Unicode字符,因此会打印。
现在,您没有指定它,它将被设置为UTF-8,看起来是UTF-8。您正在文本文件中写入字节。您正在读取这些字节并将它们解释为字符。
现在,当您写入字节时,您不需要考虑编码,而必须这样做,以便读取与char相同的字节
记事本++似乎将字节解释为Unicode字符,因此会打印。
现在,您没有指定它,它将被设置为UTF-8,。谢谢!您的编码是正确的。默认值有效,但仅在C#4.x和更早版本中有效。在.Net Core 3中,UTF-8是默认值(我假设几天后出现的.Net 5也是如此)谢谢!您的编码是对的。默认值有效,但仅在C#4.x及更早版本中有效。在.Net Core 3中,UTF-8是默认值(我假设.Net 5在几天后发布时也是如此)