Печать строк UTF-8 с использованием широких и многобайтовых строковых литералов printf

В таких операторах, где оба они вводятся в исходный код с одинаковой кодировкой (UTF-8) и локаль настроена правильно, есть ли практическая разница между ними?

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

И, следовательно, есть ли причина отдавать предпочтение одному над другим при выполнении вывода? Я полагаю, что второй работает немного хуже, но имеет ли он преимущество (или недостаток) по сравнению с многобайтовым литералом?

РЕДАКТИРОВАТЬ: Нет проблем с печатью этих строк. Но я'Я не использую широкие строковые функции, потому что я хочу иметь возможность использоватьprintf и т. д. Таким образом, вопрос заключается в том, отличаются ли эти способы печати (учитывая ситуацию, изложенную выше), и если да, имеет ли второе преимущество?

РЕДАКТИРОВАТЬ 2: После комментариев ниже, я теперь знаю, что эта программа работает - что я думал, не былот возможно:

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

EDIT3: Ямы провели дополнительное исследование, посмотрев на чтопроисходит с двумя типами. Возьмите более простую строку:

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

Компилятор генерирует другой код. Широкая строка:

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

Пока второе это:

.string "\302\243100 \317\200"

И, глядя на кодировки Unicode, второй - обычный UTF-8. Широкий символьное представление - UTF-32. Я понимаю, что это будет зависеть от реализации.

Так что, возможно, широкое символьное представление литералов более переносимо? Моя система не будет печатать кодировки UTF-16 / UTF-32 напрямую, поэтому она автоматически конвертируется в UTF-8 для вывода.

Ответы на вопрос(1)

Ваш ответ на вопрос