В подобных утверждениях, когда оба вводятся в исходный код с одинаковой кодировкой (UTF-8) и локаль настроена правильно, есть ли между ними какая-либо практическая разница?
printf("ο Δικαιοπολις εν αγρω εστιν\n");
printf("%ls", L"ο Δικαιοπολις εν αγρω εστιν\n");
И, следовательно, есть ли причина предпочесть один другому при выводе? Я предполагаю, что второй работает немного хуже, но есть ли у него какие-либо преимущества (или недостатки) по сравнению с многобайтовым литералом?
РЕДАКТИРОВАТЬ: нет проблем с печатью этих строк. Но я не использую широкие строковые функции, потому что хочу также использовать printf
и т.д. Итак, вопрос в том, отличаются ли эти способы печати (учитывая описанную выше ситуацию), и если да, то есть ли у второго какое-либо преимущество?
EDIT2: после комментариев ниже я знаю, что эта программа работает, что, как мне казалось, было невозможно:
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 для вывода.
%s
, а не%ls
. Или я все еще неправильно понимаю вопрос. - person Adrian McCarthy   schedule 20.03.2013