Ich versuche, die Grundlagen von Unicode und UTF-8 zu lernen, und bisher läuft es sehr reibungslos. Ich weiß, dass es möglich ist, die Kodierung einer Datei beim Öffnen auszuwählen.
Wenn ich Text mit der Tastatur in einem Texteditor eingebe (GeditoderVim) oder eine Eingabeaufforderung, welche Kodierung wird von der Tastatur an die Anwendung gesendet? Ist sie auf Windows-Rechnern anders? Kann sie konfiguriert werden?
Antwort1
SehenWie funktionieren Tastatureingabe und Textausgabe?für einen Überblick über das Thema. Es hängt davon ab, ob die Anwendung in einem Terminal ausgeführt wird oder direkt mit der GUI-Umgebung kommuniziert.
In einem Terminal bestimmt die Terminalsoftware (in diesem Jahrhundert im Allgemeinen ein Terminalemulator) die Zeichenkodierung. Sie übermittelt die Zeichenkodierung (die gleiche für Eingabe und Ausgabe) durch Festlegen derGebietsschemaUmgebungsvariable LC_CTYPE
. Wenn diese Variable nicht gesetzt oder auf gesetzt ist C
, stellt das Terminal keine Informationen bereit, sodass die Anwendung die Kodierung nicht kennen kann. In einem Terminal werden Zeichen als Zeichen an die Anwendung gesendet; nicht-zeichenbasierte Eingaben (Funktionstasten, Cursortasten, Tasten mit Modifikatoren wie usw. Alt) werden als gesendetEscape-Sequenzen(einige von ihnen alsSteuerzeichenstattdessen).
X11Anwendungen erhalten Input in Form vonKeyPress-Ereignisse. KeyPresss-Ereignisse enthalten eine Low-Level-Anzeige ( keycode
die ungefähr der physischen Position der Taste entspricht und state
die aktiven Modifikatoren kodiert). Die Anwendung kann eine Funktion wieXLookupString
(traditionelle Funktion, beschränkt auf Latin-1) oderXmbLookupString
(Funktion, die andere Unibyte-Kodierungen unterstützt) oderXwcLookupString
(Funktion, die Multibyte-Kodierungen unterstützt) oderXutf8LookupString
(moderne UTF-8-Funktion), um diese Rohinformationen in eine Zeichenfolge umzuwandeln.
Die Zuordnung von Tasten zu Zeichen kann auf verschiedenen Ebenen geändert werden.Wie funktionieren Tastatureingabe und Textausgabe?hat den Überblick.
Antwort2
Die Tastatur sendet keine Zeichen, sondern Scancodes. Wenn Sie beispielsweise auf einer typischen amerikanischen Tastatur die Taste mit der Bezeichnung „e“ drücken, sendet sie einen Scancode, der im Wesentlichen „3. Taste von links in der 2. Reihe alphanumerischer Tasten in der Hauptgruppe“ lautet. Dieser Scancode wird vom Kernel (oder einer anderen Komponente des Betriebssystems) und, speziell unter Linux, möglicherweise vom grafischen Subsystem in ein Zeichen (oder allgemein in ein Tastensymbol, denken Sie an Tasten wie „Druck“) umgewandelt.
Im Allgemeinen stellt das Betriebssystem oder das grafische Subsystem ein oder mehrere Dienstprogramme bereit, die die Konvertierungstabellen steuern. Beispielsweise können Sie sowohl unter Windows als auch unter Linux beliebig viele Tastaturlayouts installieren und problemlos zwischen ihnen wechseln.
Was die Anwendung erhält, hängt von den Konventionen des Betriebssystems ab. Unter Windows erhalten Konsolenanwendungen ein Zeichen, das gemäß der aktuellen Konsolen-Codepage codiert ist, die durch den Befehl festgelegt wurde chcp
. Grafische Anwendungen erhalten ein Tastensymbol, das normalerweise in ein UTF-16-codiertes Zeichen übersetzt wird. Unter Linux erhalten Anwendungen normalerweise ein UTF-8-codiertes Zeichen. Wenn ich beispielsweise ă
bei korrekt eingestelltem Tastaturlayout die Taste mit der Bezeichnung (LATIN SMALL LETTER A WITH BREVE, U+0103) drücke,
- Eine Konsolenanwendung unter Windows
chcp 1250
erhält ein Byte'\xE3'
(227 dezimal). - Eine Konsolenanwendung unter Windows
chcp 852
erhält ein Byte'\xC7'
(199 dezimal). - Eine grafische Anwendung unter Windows erhält ein passendes Schlüsselsymbol, welches im Normalfall als zwei Bytes
'\x03'
'\x01'
(oder als Short Integer0x103
) gespeichert bzw. verarbeitet wird. - Eine Terminalanwendung unter Linux erhält zwei Bytes
'\xC4'
'\x83'
(<U+0103> in UTF-8-Kodierung). - Eine grafische Anwendung unter Linux erhält ein passendes Tastensymbol, das im Normalfall als zwei Bytes gespeichert/verarbeitet wird
'\xC4'
'\x83'
(<U+0103> in UTF-8-Kodierung).
(Beachten Sie, dass ich mit Windows Windows NT und seine Nachfolger wie Windows XP, Windows Vista, 7 oder 10 meine. Windows 95 usw. sind eine völlig andere Reihe von Betriebssystemen, die glücklicherweise nicht mehr verwendet werden.)
In Vim erhalten Sie zwei neue Übersetzungsebenen:
Sie können eine Tastaturübersetzungstabelle mit installieren
set keymap
; siehe:help 'keymap'
und:help mbyte-keymap
. Dies erleichtert die Texteingabe in der gewünschten Sprache auf Systemen, auf denen Sie auf Betriebssystemebene kein Tastaturlayout installieren können.Mit dem Befehl können Sie eine Zuordnung definieren
:map
. Siehe:help :map
.