2

Microsoft Windows bietet verschiedene Funktionen zum Abfragen der aktuellen Codepage: GetACP, GetConsoleOutputCP, GetConsoleCP.Warum ANSI-Code-Seite und Konsolencode-Seite sind unterschiedlich?

Sie geben unterschiedliche Werte zurück. Zum Beispiel auf meiner Maschine, GetACP kehrt 1252 während GetConsoleOutputCP und GetConsoleCP Rückkehr 437.

(Wir auch chcp auf der Kommandozeile ausgeführt werden können und erhalten 437)

  • Warum bietet Windows-verschiedenen Codepages für Konsole und nicht-Konsole?
  • Wie werden diese Codeseiten pro Maschine ermittelt?
  • Wie ist die Beziehung zwischen Codepages auf demselben Computer? Gibt es eine Korrelation zwischen den Konsolenseiten und den Nicht-Konsolenseiten? Haben Maschinen mit Codepage 1252 immer eine Codepage von 437?

Der Hintergrund für diese Frage ist eine Fehlermeldung von Visual Studio C++:

error C2855: command-line option '/source-charset' inconsistent with precompiled header 
error C2855: command-line option '/execution-charset' inconsistent with precompiled header 

Diese Fehler aufgetreten ist, wenn die vorkompilierte Header-Datei mit einer anderen Standard-Code-Seite als die CPP-Datei erstellt wurde, das war mit ihnen (aus welchem ​​Grund auch immer).
Vom MSDN docs:

Wenn keine Byte-Reihenfolge-Marke gefunden wird, nimmt es die Quelldatei mit der aktuellen Benutzer-Codepage codiert ist, es sei denn, Sie mit dem ein Zeichensatz Namen oder Codepage angeben/Quelle-Zeichensatz-Option.

So versuche ich, welche Codepage sie einer beziehen, um herauszufinden, auf, die von GetACP oder die anderen zurückgegeben ...

Antwort

5

Die ANSI-und OEM-Codepages vom System locale bestimmt werden, die ist geladen, wenn das System bootet. Sie werden in jedem Prozess als die PEB-Felder AnsiCodePageData und OemCodePageData abgebildet. Die Laufzeitbibliothek in ntdll.dll hat viele Funktionen, die mit diesen Zeichenfolientypen arbeiten, z. RtlAnsiStringToUnicodeString und RtlOemStringToUnicodeString.

Funktionen, die in der Windows-API mit A enden, sind ANSI, außer dass Dateisystemfunktionen über SetFileApisToOEM auf OEM umgestellt werden können. Die Konsolen-API verwendet standardmäßig OEM für die Kompatibilität mit älteren Anwendungen und kann über SetConsoleCP und SetConsoleOutputCP in eine andere Codepage geändert werden. chcp.com (oder mode.com) ruft diese Funktionen auf, aber es erlaubt nicht, den Eingabepuffer und Bildschirmpuffer auf verschiedene Codepages einzustellen.

Wenn die ANSI-Codepage 1252 lautet, ist die OEM-Codepage nicht unbedingt 437. Dies ist nur in den USA. Die meisten westlichen Ländereinstellungen, die 1252 als ANSI-Codepage verwenden, verwenden 850 als OEM-Codepage.

Eine Anwendung, die besagt, dass die Benutzercodepage verwendet wird, verweist möglicherweise nicht auf die System-ANSI- oder OEM-Codepage. Stattdessen könnte er beispielsweise GetLocaleInfoEx aufrufen, um die LOCALE_NAME_USER_DEFAULT Sprachumgebung für die LOCALE_IDEFAULTANSICODEPAGE oder LOCALE_IDEFAULTCODEPAGE abzufragen.

+2

Für den Downvoter, wenn Sie ohne eine Erklärung downvote, das ist Ihr Vorrecht. Aber es ist hilfreicher, zumindest ein bisschen Feedback zu geben, um mich wissen zu lassen, was falsch ist. Wenn es eine Möglichkeit für mich gibt, die Antwort zu verbessern, oder wenn Ihre Gründe signifikant genug sind, sollte ich diese Antwort löschen. – eryksun

+0

Der Downvoter ist wahrscheinlich Trolling. Die Frage wurde auch ohne Erklärung abgelehnt. Das letzte, was du erwähnt hast, hat mich verwirrt. Haben wir neben ANSI und OEM noch andere Codepages? Laut [dieser MSDN-Seite] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd373761 (v = vs.85) .aspx) gibt 'LOCALE_IDEFAULTANSICODEPAGE' die ANSI-Codepage und 'LOCALE_IDEFAULTCODEPAGE' zurück 'gibt die OEM-Codepage zurück. In welchem ​​Fall würden sie sich von den Codepages unterscheiden, die von "GetACP", "GetConsoleCP" usw. zurückgegeben werden? –

+0

In den meisten Windows-Sprachumgebungen sind ANSI- und OEM-Codepages definiert. Das Gebietsschema des Benutzers entspricht nicht unbedingt dem Gebietsschema des Systems. Sie können die Regionsanwendung in der Systemsteuerung verwenden, um das Benutzergebietsschema (d. H. "Format") zu ändern. 'GetLocaleInfoEx' wird dies dynamisch in den Werten reflektieren, die für' LOCALE_IDEFAULTANSICODEPAGE' und 'LOCALE_IDEFAULTCODEPAGE' (OEM) zurückgegeben werden. Das Ändern des Systemgebietsschemas (region-> administrativ) erfordert jedoch einen Neustart, um eine Änderung zu sehen, die sich in 'GetACP()' und 'GetOEMCP()' widerspiegelt. – eryksun

2

Die Befehlskonsole verwendet aus Legacy-Gründen eine andere Codepage.Die Programme, die auf der Konsole ausgeführt wurden, wurden oft für DOS geschrieben, und der Zeichensatz enthielt Dinge wie Zeichen, die in diesem Zusammenhang nützlich sein könnten. In einer grafischen Umgebung mit nativen Windows-Apps war es wichtiger, die verfügbaren Zeichen zu erweitern, da die Zeilen direkt gezeichnet und nicht in Zeichensätzen simuliert würden.

Die Standardcodeseiten werden von der Sprache bestimmt, die Windows verwendet. Unterschiedliche Sprachen erfordern unterschiedliche Zeichen, und eine einzige Codepage genügte nicht für alle Zeichen, die von europäischen Sprachen verwendet werden. Sie finden code page 1250 zum Beispiel in einigen zentral- und osteuropäischen Standorten verwendet.

Verwandte Themen