Drucken von UTF-8-Zeichenfolgen mit printf-wide- oder multibyte-Zeichenfolgenliteralen

Gibt es in solchen Anweisungen, in denen beide mit derselben Codierung (UTF-8) in den Quellcode eingegeben werden und das Gebietsschema ordnungsgemäß eingerichtet ist, einen praktischen Unterschied?

printf("ο Δικαιοπολις εν αγρω εστιν\n");
printf("%ls", L"ο Δικαιοπολις εν αγρω εστιν\n");

Und gibt es infolgedessen einen Grund, bei der Ausgabe den anderen vorzuziehen? Ich stelle mir vor, dass die zweite ein gutes Stück schlechter abschneidet, aber hat sie einen Vorteil (oder Nachteil) gegenüber einem Multibyte-Literal?

BEARBEITEN: Es gibt keine Probleme beim Drucken dieser Zeichenfolgen. Aber ich benutze die Wide-String-Funktionen nicht, weil ich sie nutzen möchteprintf usw. auch. Die Frage ist also, ob diese Druckmethoden unterschiedlich sind (in der oben beschriebenen Situation). Wenn ja, hat die zweite einen Vorteil?

EDIT2: Nach den Kommentaren unten weiß ich jetzt, dass dieses Programm funktioniert - was ich nicht für möglich gehalten habe:

int main()
{
    setlocale(LC_ALL, "");
    wprintf(L"ο Δικαιοπολις εν αγρω εστιν\n");  // wide output
    freopen(NULL, "w", stdout);                 // lets me switch
    printf("ο Δικαιοπολις εν αγρω εστιν\n");    // byte output
}

EDIT3: Ich habe einige weitere Nachforschungen angestellt, indem ich mir angesehen habe, was mit den beiden Typen los ist. Nehmen Sie eine einfachere Zeichenfolge:

wchar_t *wides = L"£100 π";
char *mbs = "£100 π";

Der Compiler generiert einen anderen Code. Die breite Zeichenfolge lautet:

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

Bei den Unicode-Codierungen ist die zweite einfach UTF-8. Die breite Zeichendarstellung ist UTF-32. Mir ist klar, dass dies von der Implementierung abhängt.

Vielleicht ist die breite Zeichendarstellung von Literalen also portabler? Mein System druckt keine UTF-16 / UTF-32-Codierungen direkt, daher wird es für die Ausgabe automatisch in UTF-8 konvertiert.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage