Почему утешает.Функция 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(...)
и попробуйте распечатать это