Wie kann ich die wchar_t-Werte auf die Konsole drucken?
Lesezeit: 5 Minuten
Beispiel:
#include <iostream>
using namespace std;
int main()
{
wchar_t en[] = L"Hello";
wchar_t ru[] = L"Привет"; //Russian language
cout << ru
<< endl
<< en;
return 0;
}
Dieser Code gibt nur HEX-Werte wie Adresse aus. Wie drucke ich die Zeichenfolge wchar_t?
Die allererste verwandte Frage ist stackoverflow.com/questions/1625531/…
– anon
22. März 2010 um 16:12 Uhr
Auf welchem Betriebssystem und mit welcher Konsolen-App? Einige Konsolen unterstützen Unicode nicht.
– niemand
22. März 2010 um 16:22 Uhr
Danke. Ich schrieb eine VC++-Konsolenanwendung, die die Befehlsargumente ausgab, und die Ausgabe ließ mich zusammenzucken.
– James Ko
18. Juli 2015 um 4:13 Uhr
Nate
Bearbeiten: Dies funktioniert nicht, wenn Sie versuchen, Text zu schreiben, der in Ihrem Standardgebietsschema nicht dargestellt werden kann. 🙁
Verwenden std::wcout anstatt std::cout.
wcout << ru << endl << en;
Es druckt nur englische Zeichenfolge. Was ist mit Russisch?
– zed91
22. März 2010 um 16:14 Uhr
Die Konsole wird nicht Unicode-fähig sein. Die Ausgabeumleitung ist das Aufhängen, das im 8-Bit-Char-Legacy feststeckt. Es kann nur korrekten Text auf einem russischen Computer ausgeben, wenn die richtige Konsolenschriftart geladen ist.
– Hans Passant
22. März 2010 um 17:19 Uhr
Beachten Sie, dass Sie, wenn Sie dies versuchen, um auf einer Linux-Konsole zu drucken, wahrscheinlich verstümmelte Zeichen erhalten, da die meisten Linux-Systeme die utf16-Codierung nicht verwenden.
Dieses spezielle Problem kann behoben werden, indem zu einem Gebietsschema gewechselt wird, das UTF-8 verwendet, aber ein ähnliches Problem existiert unter Windows, das nicht einfach mit Standardeinrichtungen behoben werden kann.
Haftungsausschluss: Ich bin der Autor von {fmt}.
Ray Chakrit
Windows hat die sehr verwirrenden Informationen. Sie sollten das C/C++-Konzept von Unix/Linux lernen, bevor Sie in Windows programmieren.
wchar_t speichert Zeichen in UTF-16, was eine feste 16-Bit-Speichergröße ist, die Breitzeichen genannt wird, aber wprintf() oder wcout() werden nicht-englische Breitzeichen niemals korrekt drucken, da keine Konsole in UTF-16 ausgeben wird. Windows gibt im aktuellen Gebietsschema aus, während Unix/Linux in UTF-8 ausgeben, alle sind Multibyte. Sie müssen also breite Zeichen vor dem Drucken in Multibyte umwandeln. Der Unix-Befehl wcstombs() funktioniert nicht unter Windows, verwenden Sie stattdessen WideCharToMultiByte().
Zuerst müssen Sie die Datei mit Notepad oder einem anderen Editor in UTF-8 konvertieren. Installieren Sie dann die Schriftart in der Eingabeaufforderungskonsole, damit sie in Ihrer Sprache lesen/schreiben kann, und ändern Sie die Codepage in der Konsole in UTF-8, um sie korrekt anzuzeigen, indem Sie in die Eingabeaufforderung „chcp 65001“ eingeben, während Cygwin bereits standardmäßig auf UTF-8 eingestellt ist. Hier ist, was ich auf Thai gemacht habe.
#include <windows.h>
#include <stdio.h>
int main()
{
wchar_t* in=L"ทดสอบ"; // thai language
char* out=(char *)malloc(15);
WideCharToMultiByte(874, 0, in, 15, out, 15, NULL, NULL);
printf(out); // result is correctly in Thai although not neat
}
Beachten Sie, dass 874=(Thai) Codepage im Betriebssystem, 15=Stringgröße
Mein Vorschlag ist, das Drucken von nicht-englischen Breitzeichen auf der Konsole zu vermeiden, es sei denn, dies ist erforderlich, da dies nicht einfach ist.
Max Barannyk
#include <iostream>
using namespace std;
void main()
{
setlocale(LC_ALL, "Russian");
cout << "\tДОБРО ПОЖАЛОВАТЬ В КИНО!\n";
}
Sie können diese Antwort verbessern, indem Sie eine Erklärung für Ihren Code angeben.
– James Elderfield
11. August 2016 um 12:09 Uhr
Willkommen bei Stapelüberlauf! Obwohl dieser Code helfen kann, das Problem zu lösen, erklärt er es nicht warum und/oder wie es beantwortet die Frage. Die Bereitstellung dieses zusätzlichen Kontexts würde seinen langfristigen Wert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der geltenden Einschränkungen und Annahmen.
– Toby Speight
11. August 2016 um 16:27 Uhr
Michael Speer
Sie könnten ein normales Char-Array verwenden, das tatsächlich mit UTF-8-Zeichen gefüllt ist. Dies sollte das Mischen von Zeichen über Sprachen hinweg ermöglichen.
Sie können diese Antwort verbessern, indem Sie eine Erklärung für Ihren Code angeben.
– James Elderfield
11. August 2016 um 12:09 Uhr
Willkommen bei Stapelüberlauf! Obwohl dieser Code helfen kann, das Problem zu lösen, erklärt er es nicht warum und/oder wie es beantwortet die Frage. Die Bereitstellung dieses zusätzlichen Kontexts würde seinen langfristigen Wert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der geltenden Einschränkungen und Annahmen.
Die allererste verwandte Frage ist stackoverflow.com/questions/1625531/…
– anon
22. März 2010 um 16:12 Uhr
Auf welchem Betriebssystem und mit welcher Konsolen-App? Einige Konsolen unterstützen Unicode nicht.
– niemand
22. März 2010 um 16:22 Uhr
Danke. Ich schrieb eine VC++-Konsolenanwendung, die die Befehlsargumente ausgab, und die Ausgabe ließ mich zusammenzucken.
– James Ko
18. Juli 2015 um 4:13 Uhr