Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用513个空格字符的C#将文本写入文件_C#_Notepad++_Notepad_Writefile_Writealltext - Fatal编程技术网

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

用513个空格字符的C#将文本写入文件,c#,notepad++,notepad,writefile,writealltext,C#,Notepad++,Notepad,Writefile,Writealltext,下面是将字符串写入文件的代码 System.IO.File.WriteAllText("test.txt", "P

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

System.IO.File.WriteAllText("test.txt", "P                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ");
基本上是字符“p”,后跟513个空格字符

当我用记事本++打开文件时,它看起来很好。然而,当我在windows记事本中打开时,我看到的只是乱码字符

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


我遗漏了什么?

尝试传递不同的编码:

i. System.IO.File.WriteAllText(filename , stringVariable, Encoding.UTF8);
ii. System.IO.File.WriteAllText(filename , stringVariable, Encoding.UTF32);
iii. etc.
你也可以尝试用另一种方法来构建你的字符串,使它更容易阅读、更改和计数,而不是轻敲空格键513次

一,。使用字符串构造函数(如@Tigran建议)

二,。使用stringBuilder

var stringBuilder = new StringBuilder();
stringBuilder.Append("P");

for (var i = 1; i <= 513; i++) { stringBuilder.Append(" "); }

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

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

我还应该说,你的文件内容本身并没有“错误”…奇怪的格式纯粹是由于记事本的“猜测”算法。因此,除非要求人们使用记事本读取包含1个字母和大量奇数空格的文件,否则不要担心。如果您改为使用
编码.UTF8
写入文件,那么您确实需要确保读取您文件的任何其他系统都知道如何遵守BOM,因为它是对文件内容的真正更改。如果您无法验证文件的所有使用者是否都可以/将处理BOM,那么更安全的做法可能是了解记事本碰巧对您的特定用例做出了错误的猜测,并将原始内容完全按照您的要求保留

您可以通过执行二进制读取,然后将其转换为字符串来验证文件与BOM表之间的物理差异(您无法通过
ReadAllText
“查看”更改,因为它将接受BOM表并将其剥离):


请使用
“P”+新字符串(“”,513)
记事本未正确检测到文件编码。
file.WriteAllText(字符串,字符串)
默认情况下使用UTF-8。请参阅。如果要解决此问题,请指定UTF-8并以BOM表开始文件。@amen他的建议不是解决您的问题。而是缩短代码,因为字符串中513个空格是不正确的。@amen:这是因为编写时间短,而不是一个解决方案。是的,如果您没有告诉某个程序哪个字符编码文本le使用的是猜测(除非有一些适用的标准,如JSON、XML、HTML等,或其他必要信息源,如项目文件等)
var stringBuilder = new StringBuilder();
stringBuilder.Append("P");

for (var i = 1; i <= 513; i++) { stringBuilder.Append(" "); }
public string AppendSpacesToString(string stringValue, int numberOfSpaces) 
{
    var stringBuilder = new StringBuilder();
    stringBuilder.Append(stringValue);
    stringBuilder.Append(new String(' ', numberOfSpaces));
    return stringBuilder.ToString();
}
byte[] contents = System.IO.File.ReadAllBytes("test.txt");
Console.WriteLine(Encoding.ASCII.GetString(contents));