10 Stimmen

unicode hello world für C?

Ich versuche, Dinge wie , , aus C auszugeben.

#include <wchar.h>
int main()
{
    fwprintf(stdout, L", , \n");
    return 0;
}

Ausgabe ist ?, ?, ?

Wie kann ich diese Zeichen drucken?

Edit :

#include <wchar.h>
#include <locale.h>
int main()
{
    setlocale(LC_CTYPE, "");
    fwprintf(stdout, L", , \n");
    return 0;
}

Dies hat den Trick getan. Ausgabe ist , , . außer, dass das chinesische Zeichen und Schneemann erscheint als Feld in meinem urxvt wahrscheinlich, weil ich nicht diese Gebietsschemata aktivieren.

$ locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP.utf8
ko_KR
ko_KR.euckr
ko_KR.utf8
korean
korean.euc
POSIX
zh_CN.utf8

welches Gebietsschema muss ich zusätzlich aktivieren, damit chinesische Zeichen und Schneemann angezeigt werden? brauche ich vielleicht eine Schriftart?

Funktioniert das obige Programm unter Windows?

9voto

Alnitak Punkte 324207

Sie müssen Ihr Ausgabegerät als Unicode-kompatibel einstellen.

Unter Linux (mit Bash-Shell) versuchen Sie es:

$ LANG=en.UTF-8

und stellen Sie außerdem sicher, dass Ihr Terminalemulator Unicode anzeigen kann und entsprechend konfiguriert ist.

6voto

Es gibt viele einzelne Schritte im Prozess der Unicode-Ausgabe, die alle korrekt konfiguriert sein müssen.

Erstens, kompilieren Sie mit aktivierter Unicode-Unterstützung? Sie müssen dies unter Windows tun (-D UNICODE -D __UNICODE).

Zweitens: Senden Sie an eine Befehlszeile, die Unicode unterstützt, und zwar sowohl im Prinzip als auch mit einer Schriftart, die die Glyphen der von Ihnen gesendeten Zeichen enthält?

Drittens: Stimmen die von Ihrem Compiler und Ihrer Befehlszeile verwendeten Unicode-Kodierungen überein? Es hat keinen Sinn, UCS2 in Ihrer Binärdatei zu haben, wenn Ihre Befehlszeile UTF8 erwartet.

Sie müssen Unicode und seine Kodierungen wirklich verstehen, um dies richtig zu machen. Bilden Sie sich nicht ein, dass es einfach ist oder dass Sie nicht alle zugrundeliegenden Konzepte lernen müssen; diese Dinge funktionieren nicht zufällig, weil es zu viele Dinge gibt, die genau richtig sein müssen.

4voto

dirkgently Punkte 104289

Das C wchar_t ist definiert als:

Typ wchar_t ist ein eindeutiger Typ, dessen Werte eindeutige Codes für alle Mitglieder des größten erweiterten Zeichensatzes darstellen können, der unter den unterstützten Gebietsschemata angegeben ist (22.1.1). [...]

Der Unterschied zwischen Multibyte-Zeichen und wchar_t :

Multibyte-Zeichen können je nach Kodierung (z. B. UTF-8, UTF-16) mehr als ein Byte für ein bestimmtes Zeichen erfordern.

während

wchar_t hat eine feste Größe, d.h. sizeof(wchar_t), die durch die Implementierung definiert ist. Beachten Sie, dass diese Breite definiert, welche Kodierung(en) Ihre wchar_t unterstützen kann. Wenn also sizeof(wchar_t) == 2 können Sie auf keinen Fall die UTF-32-Kodierung verwenden.

Denken Sie auch daran, dass wchar_t hat selbst keinen Sinn für die Verschlüsselung. Sie müssen dem Compiler zunächst mitteilen, welche Art von Kodierung er für wchar_t Daten. Die fehlerhafte Ausgabe ist höchstwahrscheinlich darauf zurückzuführen, dass die Zeichen in der Standardkodierung behandelt werden, die diese Zeichen nicht richtig unterstützen kann, und eine fehlgeschlagene Übereinstimmung führt zu einer Ausgabe im Stil von "notdef".

1voto

Sie müssen Ihr System so konfigurieren, dass es diese Zeichen akzeptiert. Was benutzen Sie? Windows, Linux?

0voto

eel ghEEz Punkte 1113

Wie von Alnitak vorgeschlagen, muss man ein Gebietsschema mit einem Zeichensatz/einer Kodierung angeben, der/die die anzuzeigenden Zeichen enthält. (Unicode/)UTF-8 sollte alle Unicode-Zeichen abdecken.

Ihr Terminal sollte eine Schriftart verwenden, die über entsprechende Glyphen verfügt.

CMD.EXE von Windows ist notorisch schwach, wenn es um Zeichensätze jenseits von 8 Bit geht. Vielleicht brauchen Sie ein GUI-Fenster, anstatt sich auf stdout zu verlassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X