Ich schreibe eine .NET Core-Konsolenanwendung. Ich wollte die Konsoleneingabe auf eine bestimmte Anzahl von Maximalzeichen für jeden Eingang beschränken. Ich habe etwas Code, der dies tut, indem Sie eine Zeichenfolge mit Console.ReadKey()
anstelle von Console.ReadLine()
erstellen Alles funktionierte perfekt testen auf Windows. Als ich dann auf einem Raspberry Pi 3 mit Raspbian entfaltete, stieß ich schnell auf alle möglichen Probleme. Ich erinnerte mich, dass Linux Zeilenenden anders als Windows behandelt, und es scheint, Backspaces werden auch anders behandelt. Ich habe die Art und Weise geändert, wie ich diese gehandhabt habe, indem ich den ConsoleKey anstelle des Zeichens ausgeschaltet habe, und das Newline-Problem ist verschwunden, aber Backspaces werden nur manchmal registriert. Manchmal werden Zeichen auch außerhalb meines Eingabefelds an die Konsole ausgegeben, obwohl ich den ReadKey so eingestellt habe, dass er nicht selbst auf die Konsole ausgegeben wird. Fehle ich etwas darüber, wie Linux Konsoleneingaben handhabt?Warum behandelt .NET Core ReadKey auf Raspbian anders?
//I replaced my calls to Console.ReadLine() with this. The limit is the
//max number of characters that can be entered in the console.
public static string ReadChars(int limit)
{
string str = string.Empty; //all the input so far
int left = Console.CursorLeft; //store cursor position for re-outputting
int top = Console.CursorTop;
while (true) //keep checking for key events
{
if (Console.KeyAvailable)
{
//true to intercept input and not output to console
//normally. This sometimes fails and outputs anyway.
ConsoleKeyInfo c = Console.ReadKey(true);
if (c.Key == ConsoleKey.Enter) //stop input on Enter key
break;
if (c.Key == ConsoleKey.Backspace) //remove last char on Backspace
{
if (str != "")
{
tr = str.Substring(0, str.Length - 1);
}
}
else if (c.Key != ConsoleKey.Tab && str.Length < limit)
{
//don't allow tabs or exceeding the max size
str += c.KeyChar;
}
else
{
//ignore tabs and when the limit is exceeded
continue;
}
Console.SetCursorPosition(left, top);
string padding = ""; //padding clears unused chars in field
for (int i = 0; i < limit - str.Length; i++)
{
padding += " ";
}
//output this way instead
Console.Write(str + padding);
}
}
return str;
}
Es ist das * Terminal *, das Tastenanschläge verarbeitet. Sie erhalten keine Tastenanschläge, die nicht an Ihre Anwendung gesendet werden. Newlines haben damit nichts zu tun. .NET (und Core) verwendet die Einstellungen des Betriebssystems. Außerdem erkennt es bereits '\ n' als Zeilenumbruch in Windows –
Windows erkennt Wagenrücklaufzeichen,' \ r', während Linux nur Zeilenvorschubzeichen '\ n' verwendet. Ich habe ursprünglich nach '\ 'gesucht, was natürlich zu Problemen führte. Ich versuchte herauszufinden, ob es andere Unterschiede gab, für die ich nicht verantwortlich bin. Ich dachte, es wurde impliziert, dass dies mit Unterschieden in der Art und Weise, wie das Terminal Tastenanschläge handhabt, zu tun hat. Mein Punkt war nur, dass Aufrufe von ReadKey unterschiedliche Ergebnisse auf verschiedenen Rechnern ergeben, selbst wenn ich genau die gleichen Tastenanschläge mache, ohne Zweifel daran, wie die verschiedenen Systeme diese Tastenanschläge verarbeiten. – tyjkenn
Nicht so sicher, wie das alles Sinn macht. Unter Linux drücken Sie weiterhin die Eingabetaste, Sie drücken nicht Strg + J, um \ n zu erhalten. ReadKey informiert Sie über die Taste, die gedrückt wurde, und nicht, um welches Zeichen es sich handelt. Solange Sie also Key und nicht KeyChar verwenden, sollte es kein Problem geben. Vielleicht hast du ein Kompatibilitätsproblem aufgedeckt, das ist alles ziemlich neu, also ist es nicht undenkbar. Und sie unterstützen etwa zehn verschiedene Linux-Varianten und Raspian gehört nicht dazu. Am besten, um ihnen davon zu erzählen, verwenden Sie den Button [New Issue] (https://github.com/dotnet/coreclr/issues). –