Anzeigen der erweiterten ASCII-Zeichen
In Visual Studio 2005 auf 32-bit-Windows, warum nicht meine Konsole-Anzeige-Zeichen von 128 bis 255?
Beispiel:
cout << "¿" << endl; //inverted question mark
Ausgabe:
┐
Press any key to continue . . .
- Scheint zu funktionieren, Ihre Zeichensätze einfach nicht passen. Willkommen in der Welt von legacy-Zeichensätze, denn es scheint die Windows-Konsole immer noch (!!) nicht Unicode.
- Kommt es unter Unicode?
- Die Windows-Konsole wird nicht Unicode. Um genau zu sein,
WriteConsoleW
tut.WriteConsoleA
offensichtlich nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem Windows Konsole-Fenster ist Reine Unicode. Den Puffer speichert text als UCS-2-Unicode (16 bits pro Zeichen, die im wesentlichen wie die ursprüngliche Unicode, eine Beschränkung auf die Basic Multilingual Plane des modernen 21-bit-Unicode). So ein console-Fenster präsentieren können fast alle Arten von text.
Jedoch für single-byte-pro-Zeichen (und vielleicht auch für einige variable-Länge-Kodierungen) - i/o Windows automatisch übersetzt/von der Konsole-Fenster aktiven codepage. Wenn Sie die Konsole-Fenster ist ein [cmd.exe] - Instanz, dann können Sie prüfen, die über den Befehl
chcp
, kurz für ändern der codepage. Wie diese:Codepage 850 ist eine Codierung auf der Grundlage der original-IBM-PC-Deutsch-codepage 437. 850 ist der Standard für die windows-Konsole auf mindestens Norwegisch PC ' s (obwohl versierte Norweger ändern kann, dass auf 865). Keiner von denen sind Zeichensätze, die Sie verwenden sollten, jedoch.
Den original-IBM-PC-Zeichensatz (character encoding) ist bekannt als OEM, das ist eine sinnlose Abkürzung Original Equipment Manufacturer. Es hatte schöne Linien-Zeichen geeignet für den original-PC-text-Modus-Bildschirm. Generell OEM bedeutet die Standard-Codepage für die Konsole windows -, wo codepage 437 ist nur das original: es kann so konfiguriert werden, z.B. pro Fenster über
chcp
.Wenn Microsoft erstellt 16-bit-Windows wählten Sie eine andere Kodierung aus Windows bekannt als ANSI. Das original war eine Erweiterung der ISO-Latin-1, die für eine lange Zeit war der Standard auf das Internet (es ist jedoch unklar, was zuerst da war: Microsoft beteiligte sich an der Standardisierung). Diese original-ANSI ist jetzt bekannt als Windows-ANSI-Western.
ANSI ist die verwendete Codepage für nicht-Unicode-durch fast alle der rest von Windows. Konsole von windows mit OEM. Editor der andere Editoren, und so weiter, die Verwendung von ANSI.
Dann, wenn Microsoft Windows-32-bit, nahmen Sie eine 16-bit Erweiterung von Latin-1 bekannt als Unicode. Microsoft war ein original Gründungsmitglied des Unicode-Konsortiums. Und die basic-API, einschließlich der windows-Konsole, Dateisystem, etc., wurde umgeschrieben, um die Verwendung der Unicode. Für die Abwärtskompatibilität gibt es eine übersetzung Schicht, die die übersetzung zwischen OEM-und Unicode-Format für die Konsole von windows, und zwischen ANSI-und Unicode für andere Funktionen. Zum Beispiel
MessageBoxA
ist eine ANSI-wrapper für die Unicode-basierteMessageBoxW
.Das praktische Ergebnis ist, dass in Windows C++ - Quellcode ist in der Regel codiert mit ANSI -, während die Konsole von windows übernehmen OEM. Die zB macht
produzieren Reine gobbledegook... können Sie die Unicode-basierte Konsole-Fenster-APIs Unicode-Ausgabe direkt über die Konsole-Fenster, die Vermeidung der übersetzung, aber das ist umständlich.
Beachten Sie, dass die Verwendung
wcout
stattcout
hilft nichts: durch designwcout
nur übersetzt, unten von wide-character-strings an das Programm ist schmaler Zeichensatz, bei denen Informationen auf dem Weg. Es kann hart sein, zu glauben, dass der C++ - standard-Bibliothek bietet eine Recht große Brocken von sehr komplexen Funktionen, die bedeutungslos ist (da statt Konvertierungen könnte nur haben wurde unterstützt voncout
). Aber so ist es einfach sinnlos. Möglicherweise war es einigen politischen-wie Kompromisse, aber trotzdemwcout
hat nicht helfen, obwohl, wenn es sinnvoll ist in gewisser Weise dann "sollte" logisch helfen, mit diesem.Also, wie funktioniert ein Norwegisch Anfänger-Programmierer erhalten, z.B. "blåbærsyltetøy" vorgestellt?
Gut, einfach durch wechseln der aktiven Codepage auf ANSI. Da auf den meisten westlichen Land-PCs ANSI ist codepage 1252, die Sie tun können, dass für ein gegebenes Kommando-interpreter Beispiel durch
Nun alte DOS-Programme wie z.B. [edit.com] (noch vorhanden in Windows XP!) produzieren einige gobbledegook, weil die original-PC-Zeichensatz Linien-Zeichen gibt es nicht in ANSI, und denn national-Charaktere haben unterschiedliche codes in ANSI. Aber hey, wer nutzt alte DOS-Programme? Ich nicht!
Wenn Sie wollen, dass diese in einem ständigen code-Seite, die Sie ändern müssen, die Konfiguration der windows-Konsole über einen undokumentierten registry-Schlüssel:
In diesem Schlüssel ändern Sie den Wert
OEMCP
1252, und Neustart.Als mit
chcp
oder andere ändern der codepage 1252, macht alte DOS-Programme vorhanden gobbledegook, aber das macht C++ - Programme oder andere moderne Konsolen-Programme arbeiten, OK.Da haben Sie dann die gleiche Zeichencodierung in der Konsole windows-wie auch im rest von Windows.
Wenn Sie drucken ein ASCII-string, Windows intern in UNICODE konvertiert, basierend auf der aktuellen code-Seite. Es gibt auch eine übersetzung von UNICODE auf "ASCII" erfolgt durch die CRT. Die folgenden funktionieren würde.
Da die Win32-Konsole verwendet code page 437 (aka der OEM-Zeichensatz) zum Rendern von Zeichen, während die meisten der rest von Windows verwendet Windows-1252 für single-byte-Zeichencodes.
Das Zeichen "¿" ist das Unicode-Zeichen UMGEKEHRTES Fragezeichen, die code-point-0xBF (191 dezimal) in Unicode -, ISO 8859-1 und Windows-1252. Der code point 0xBF in CP437 entspricht dem Charakter "┐", die BOX-ZEICHNUNGEN LICHT nach UNTEN UND von LINKS (code point U+2510).
Solange du über die Windows-Konsole können Sie im display nur das Zeichen CP437 und keine andere. Wenn Sie anzeigen möchten anderen Unicode-Zeichen, Sie brauchen eine andere Umgebung.
Ist es wahrscheinlich umgesetzt, mit einem einfachen ascii-Zeichensatz. Die Microsoft-Programmierer nicht utf-8-Fähigkeit, die beim erstellen der Konsole. Nur eine Vermutung, da ich nicht ein Microsoft-Programmierer involviert in die Erstellung der Konsole.