Записать текст в файл в C# с 513 пробелами
Вот код, который записывает строку в файл
System.IO.File.WriteAllText("test.txt", "P ");
Это в основном символ "P", за которым следует всего 513 пробелов.
Когда я открываю файл в Notepad++, он выглядит нормально. Однако, когда я открываю в Windows Notepad, я вижу только искаженные символы.
Если вместо 513 пробела я добавлю 514 или 512, он нормально откроется в блокноте.
Что мне не хватает?
2 ответа
Что вам не хватает, так это то, что Блокнот догадывается, и это не потому, что ваша длина составляет конкретно 513 пробелов... это потому, что это четное число байтов, а размер файла>> 100 общих байтов. Попробуйте 511 или 515 пробелов... или 99 ... вы увидите то же неверное истолкование содержимого вашего файла. При нечетном количестве байтов Блокнот может предположить, что в вашем файле нет двухбайтовых кодировок, поскольку все они приводят к получению 2 байтов на символ = четное количество байтов в файле. Если вы дадите файлу еще несколько символов ASCII младшего разряда в начале (например, "PICKLE" + пробелы), Notepad сделает гораздо лучше, понимая, что он должен обрабатывать содержимое как однобайтовые символы.
Предлагаемый подход включения Encoding.UTF8
это самое простое исправление... он запишет спецификацию в начало файла, которая сообщает Notepad (и Notepad++), каков формат данных, чтобы ему не приходилось прибегать к этому предположению (вы можете увидеть разница между вашим первоначальным подходом и подходом BOM, открыв оба в Notepad ++, а затем загляните в правый нижний угол приложения. С BOM он скажет, что кодировка UTF-8-BOM
... без этого он просто скажет UTF-8
).
Я должен также сказать, что содержимое вашего файла не является "неправильным", по сути... странный формат исключительно из-за алгоритма "угадывания" Блокнота. Поэтому, если не требуется, чтобы люди использовали Блокнот для чтения вашего файла с 1 буквой и большим, нечетным количеством пробелов... возможно, просто не волнуйтесь. Если вы перешли на запись файла с Encoding.UTF8
затем вам нужно убедиться, что любая другая система, которая читает ваш файл, знает, как соблюдать спецификацию, потому что это реальное изменение содержимого вашего файла. Если вы не можете проверить, что все пользователи вашего файла могут / будут обрабатывать эту спецификацию, тогда может быть безопаснее просто понять, что Блокнот делает неправильные предположения для вашего конкретного варианта использования, и оставить необработанное содержимое именно так, как вы этого хотите.
Вы можете проверить физическую разницу в вашем файле с помощью спецификации, выполнив двоичное чтение, а затем преобразовав их в строку (вы не можете "увидеть" изменение с помощью ReadAllText
потому что это почитает и лишает спецификации):
byte[] contents = System.IO.File.ReadAllBytes("test.txt");
Console.WriteLine(Encoding.ASCII.GetString(contents));
Попробуйте передать в другой кодировке:
i. System.IO.File.WriteAllText(filename , stringVariable, Encoding.UTF8);
ii. System.IO.File.WriteAllText(filename , stringVariable, Encoding.UTF32);
iii. etc.
Также вы можете попробовать использовать другой способ построения вашей строки, чтобы было легче читать, изменять и считать, вместо того, чтобы нажимать пробел 513 раз;
я. Используйте строковый конструктор (как предложено @Tigran)
var result = "P" + new String(' ', 513);
II. Используйте stringBuilder
var stringBuilder = new StringBuilder();
stringBuilder.Append("P");
for (var i = 1; i <= 513; i++) { stringBuilder.Append(" "); }
III. Или оба
public string AppendSpacesToString(string stringValue, int numberOfSpaces)
{
var stringBuilder = new StringBuilder();
stringBuilder.Append(stringValue);
stringBuilder.Append(new String(' ', numberOfSpaces));
return stringBuilder.ToString();
}