Почему утешает.Функция 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 ONE
then *return* and print this is line 2
The overlap is: E
So 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(...)

и попробуйте распечатать это