使用513个空格字符将文本写入C#中的文件

amy*_*myn 4 c# notepad notepad++ writefile writealltext

这是将字符串写入文件的代码

System.IO.File.WriteAllText("test.txt", "P                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ");
Run Code Online (Sandbox Code Playgroud)

它基本上是字符"P",后跟总共513个空格字符.

当我在Notepad ++中打开文件时,它看起来没问题.但是,当我在Windows记事本中打开时,我看到的只是乱码.

如果不是513空格字符,我添加514或512,它在记事本中打开正常.

我错过了什么?

Dus*_*sty 5

你缺少的是记事本猜测,并不是因为你的长度特别是513个空格......这是因为它是偶数个字节,文件大小> = 100个总字节.尝试511或515个空格...或99 ...您会看到对文件内容的误解.使用奇数个字节,记事本可以假设您的文件不是任何双字节编码,因为这些都会导致每个字符2个字节=文件中的总字节数.如果你在开头给文件多了几个低位ASCII字符(例如,"PICKLE"+空格),记事本可以更好地理解它应该将内容视为单字节字符.

建议的包含方法Encoding.UTF8是最简单的修复方法......它会在文件的开头写一个BOM,告诉记事本(和Notepad ++)数据的格式是什么,这样它就不必诉诸于这种猜测行为(您可以通过在Notepad ++中打开两者来查看原始方法和BOM方法之间的差异,然后查看应用程序的右下角.使用BOM,它会告诉您编码是UTF-8-BOM......没有它,它会说UTF-8).

我还应该说你的文件内容本身并不"错误"......奇怪的格式纯粹是由于Notepad的"猜测"算法.因此,除非要求人们使用记事本以1个字母和大量奇数个空格读取您的文件......也许只是不要冒汗.如果您更改为使用写入文件Encoding.UTF8,则需要确保读取文件的任何其他系统都知道如何遵守BOM,因为它对文件内容的真正更改.如果您无法验证文件的所有使用者是否能够/将处理BOM,那么只需了解记事本恰好对您的特定用例做出错误猜测并将原始内容完全保留在您想要的位置可能更安全.

您可以通过执行二进制读取来验证文件中的物理差异,然后将它们转换为字符串(您无法"看到"更改ReadAllText,因为它符合并剥离BOM):

byte[] contents = System.IO.File.ReadAllBytes("test.txt");
Console.WriteLine(Encoding.ASCII.GetString(contents));
Run Code Online (Sandbox Code Playgroud)