Почему утешает.Функция WriteLine () пропускает некоторые символы в строке?
у меня есть строка, объявленная как:
 string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";
и все же, когда я пишу Console.WriteLine(text);, 
на выход - это:
this is line 2E
Почему такое поведение происходит? Или это потому что я дура и упускаю что-то очевидное?
Почему он не печатает:
THIS IS LINE ONE [CR] //where the CR is a non printed character 
this is line 2
редактировать
обратите внимание: это не вопрос "Как добавить возврат каретки".
7 ответов
(char)13 экипаж возвращение (на левом поле текущей строки)
THIS IS LINE ONE \r this is line 2"
интерпретируется как:
Print                     THIS IS LINE ONEthen *return* and print    this is line 2The overlap is:                          ESo you see:                this is line 2E
так ведет себя стандартный вывод на консоли.
- 
"\n"((Char)10) переместит курсор в начало следующей строки
- 
"\r"((Char)13) переместит курсор в начало текущей строки
таким образом, результаты являются первой строкой, перезаписанной второй строкой, оставляя только дополнительные символы, которые Вторая строка не может перезаписать.
поскольку вы уточнили, что строка / символы имеют чтобы быть таким, чтобы получить поведение, которое вы хотите, когда этот текст в конечном итоге отправляется в место вы на самом деле хотите отправить его на матричный принтер, затем вам нужно протестировать сам принтер.
вышеуказанное поведение локализовано к стандартной консоли. Если вы выводите те же символы в "стандартный вывод", но перенаправили это на принтер, важно определение принтера о том, как обращаться с этими символами, и это может быть разные из стандартной консоли.
таким образом, поведение, которое вы видите на стандартной консоли, - это просто поведение стандартной консоли. Вам нужно протестировать принтер, чтобы увидеть, как это ведет себя.
Если вы хотите, чтобы это поведение:
THIS IS LINE ONE [CR] //where the CR is a non printed character 
this is line 2
вам нужен этот код:
        char a = (char)10;
        string text = "THIS IS LINE ONE" + a + "this is line 2"
        Console.WriteLine(text);
возврат каретки ((Char) 13) - это управляющий символ или механизм, используемый для сброса положения устройства в начало строки текста, из-за этого вы испытываете это поведение. Как я сказал, вам нужно (char)13 для вашего дела.
" возвращение экипажа, Иногда известное как возвращение патрона и часто сокращение до CR, или return, является управляющим символом или механизмом используется для сброса положения устройства в начало строки текста."(источник)
CR никогда не меняет строку, на самом деле она возвращается до самого начала "THIS IS LINE ONE " и печать " this is line 2" поверх него, следовательно, почему вы видите дополнительный E В конце предложения, как первая строка на одного персонажа больше. Это становится яснее, если вы удалите два пробела из двух строк (последний символ первой строки и первый символ второй строки), где вывод становится "this is line 2NE".
из того же источника:
" оно командует принтером, или другой системой вывода Как дисплей, к переместить курсор в первую позицию на том же линия."
то, что вы ищете не CR, но a комбинация CR и LF (строки): CRLF
(Char)13 это возврат каретки, а (Char)10 это линия подачи. Как говорили другие, это означает, что (Char)13 вернется к началу строки, на которой вы находитесь, так что к тому времени, когда вы напишете (более короткую) строку 2, она будет написана поверх первого раздела строки - таким образом, оставшаяся "E".
если вы попробуете его с более короткой второй строкой, вы можете увидеть, что это происходит:
string text = "THIS IS LINE ONE " + (Char)13 +"test";
Console.WriteLine(text);
дает вывод:
"test IS LINE ONE"
поэтому, чтобы решить вашу проблему, правильный код будет:
string text = "THIS IS LINE ONE " + (Char)10 +"test";
Console.WriteLine(text);
выходы:
THIS IS LINE ONE
this is line 2
Edit:
первоначально, поскольку вы сказали, что ваш принтер требует, чтобы он был (Char)13, я предложил попробовать оба (Char)10 + (Char)13 (или наоборот) для достижения аналогичного эффекта. Однако, благодаря чрезвычайно полезным комментариям Питера м, похоже, что марка принтера, который вы используете, на самом деле требует только (Char)10 - по руководство, (Char)10 произведет линию питание и возвращение экипажа, которое чего вы требуете.
на выход это не то, чем кажется. Ваша терминальная программа скрывает некоторые символы байтов, написанных в stdout, потому что он интерпретирует присутствие возврата каретки как команду макета текста (то есть, вернуться влево). Hexdump может подтвердить, что выход правильно, показывая сами байты выход.
using System;
public class Hello1 {
  public static void Main()  {
     string text = "THIS IS LINE ONE "+(Char)(13)+" this is line 2";
     System.Console.WriteLine(text);
   }   
}
скомпилировать и запустить :
$ gmcs a.cs
$ ./a.exe
 this is line 2E
$ ./a.exe | hexdump -C
00000000  54 48 49 53 20 49 53 20  4c 49 4e 45 20 4f 4e 45  |THIS IS LINE ONE|
00000010  20 0d 20 74 68 69 73 20  69 73 20 6c 69 6e 65 20  | . this is line |
00000020  32 0a                                             |2.|
00000022
использовать string.Concat() для объединения 
string text = String.Concat(...)
и попробуйте распечатать это
