In Anweisungen wie diesen, wo beide in den Quellcode mit der gleichen Codierung (UTF-8) eingegeben werden und das Gebietsschema richtig eingerichtet ist, gibt es keine praktischer Unterschied zwischen ihnen?Drucken von UTF-8-Zeichenfolgen mit printf - Wide oder Multibyte-Zeichenfolgenliteralen
printf("ο Δικαιοπολις εν αγρω εστιν\n");
printf("%ls", L"ο Δικαιοπολις εν αγρω εστιν\n");
Und folglich gibt es irgendeinen Grund, einen vor dem anderen zu bevorzugen, wenn man Ausgabe macht? Ich stelle mir vor, dass die zweite etwas schlechter abschneidet, aber hat sie einen Vorteil (oder Nachteil) gegenüber einem Multibyte-Literal?
EDIT: Es gibt keine Probleme mit diesen Strings Drucken. Aber ich benutze die Wide-String-Funktionen nicht, weil ich auch printf
usw. verwenden möchte. Die Frage ist also, ob diese Art des Druckens anders ist (angesichts der oben beschriebenen Situation), und wenn ja, hat die zweite einen Vorteil?
EDIT2: die Kommentare unten Nach, ich weiß jetzt, dass dieses Programm funktioniert - das fand ich doch nicht möglich war:
int main()
{
setlocale(LC_ALL, "");
wprintf(L"ο Δικαιοπολις εν αγρω εστιν\n"); // wide output
freopen(NULL, "w", stdout); // lets me switch
printf("ο Δικαιοπολις εν αγρω εστιν\n"); // byte output
}
EDIT3: ich einige weitere Forschung getan haben durch schauen, was mit den beiden Typen los ist. Nehmen Sie eine einfachere Zeichenfolge:
wchar_t *wides = L"£100 π";
char *mbs = "£100 π";
Der Compiler generiert anderen Code. Die breite Zeichenfolge ist:
.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string " "
.string ""
.string ""
.string "\300\003"
.string ""
.string ""
.string ""
.string ""
.string ""
Während der zweite ist:
.string "\302\243100 \317\200"
Und bei den Unicode-Codierungen suchen, die zweite Ebene UTF-8. Die breite Zeichendarstellung ist UTF-32. Ich weiß, dass dies von der Implementierung abhängig sein wird.
Also ist vielleicht die breite Zeichendarstellung von Literalen tragbarer? Mein System druckt UTF-16/UTF-32-Kodierungen nicht direkt, sondern wird zur Ausgabe automatisch in UTF-8 konvertiert.
Sie sagten beide Beispiele mit UTF-8 eingegeben werden. Wenn der Text in der zweiten Beispielzeile eher UTF-8 als eine breite Kodierung ist, dann sollten Sie wahrscheinlich nicht das L-Präfix haben, und deshalb würden Sie nur '% s' statt '% ls' verwenden. Oder ich verstehe die Frage immer noch falsch. –
@AdrianMcCarthy - beide Zeichenfolgen im Quellcode sind UTF-8, ja. Aber ein String-Literal ist immer Multibyte - "Ein Zeichenketten-Literal ist eine Folge von null oder mehr Multibyte-Zeichen in Anführungszeichen, wie in" xyz ". Ein breites String-Literal ist das gleiche, außer durch den Buchstaben L vorfixiert. " vom Standard. – teppic
AFAIR, alle Zeichen, die nicht im Basic Source Character Set sind (was eine * Teilmenge * von US-ASCII-7 ist), rufen implementationsdefiniertes Verhalten auf, d.h. alles, was hier diskutiert wird, hängt effektiv vom verwendeten Compiler ab. Wenn Sie wirklich auf Nummer sicher gehen wollen (und portabel), müssten Sie auf \ u ... und \ U ... zurückgreifen. – DevSolar