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

Wie kann ich die wchar t Werte auf die Konsole drucken
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.

    – Björn Lindqvist

    11. Februar 2014 um 17:46 Uhr

Wie kann ich die wchar t Werte auf die Konsole drucken
Konrad

Kann ich vorschlagen std::wcout ?

Also so etwas:

std::cout << "ASCII and ANSI" << std::endl;
std::wcout << L"INSERT MULTIBYTE WCHAR* HERE" << std::endl;

Möglicherweise finden Sie hier weitere Informationen in einer verwandten Frage.

  • Überprüfen Sie, ob dies mit russischer Sprache funktioniert (kopieren Sie es). Für mich nicht.

    – Euri Pinhollow

    28. Februar 2017 um 17:52 Uhr

  • Siehe diesen Thread über das Mischen cout und wcout Schwächen. stackoverflow.com/questions/8947949/…

    – Jesse Chisholm

    23. August 2017 um 20:46 Uhr

Wie kann ich die wchar t Werte auf die Konsole drucken
vitaut

Sie können breite Zeichenfolgen nicht portabel mit Standard-C++-Einrichtungen drucken.

Stattdessen können Sie verwenden die Open-Source-{fmt}-Bibliothek um Unicode-Text portabel zu drucken. Zum Beispiel (https://godbolt.org/z/nccb6j):

#include <fmt/core.h>

int main() {
  const char en[] = "Hello";
  const char ru[] = "Привет";
  fmt::print("{}\n{}\n", ru, en);
}

Drucke

Привет
Hello

Dies erfordert das Kompilieren mit der /utf-8 Compiler-Option in MSVC.

Zum Vergleich schreiben Sie an wcout unter Linux:

wchar_t en[] = L"Hello";
wchar_t ru[] = L"Привет";
std::wcout << ru << std::endl << en;

kann den russischen Text ins Lateinische transliterieren (https://godbolt.org/z/za5zP8):

Privet
Hello

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}.

1646334617 650 Wie kann ich die wchar t Werte auf die Konsole drucken
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.

1646334617 992 Wie kann ich die wchar t Werte auf die Konsole drucken
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

1646334618 161 Wie kann ich die wchar t Werte auf die Konsole drucken
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.

    – Toby Speight

    11. August 2016 um 16:27 Uhr

Mit können Sie breite Zeichen drucken wprintf.

#include <iostream>

int main()
{
    wchar_t en[] = L"Hello";
    wchar_t ru[] = L"Привет"; //Russian language
    wprintf(en);
    wprintf(ru);
    return 0;
}

Ausgabe:

Hallo
Привет

926530cookie-checkWie kann ich die wchar_t-Werte auf die Konsole drucken?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy