История изменений
Исправление AlexM, (текущая версия) :
А, ну и про установку локали не забыть, чтобы подсистема знала, в какую целевую многобайтную кодировку всё транслировать:
alex@galene ~ $ cat >/tmp/hello.c
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
int main(void) {
setlocale(LC_CTYPE, "");
wchar_t greetings[] = L"Привет, мир!\n";
for(wchar_t* p = greetings; *p; ++p) {
if (*p == L'и')
*p = L'Ю';
fputwc(*p, stdout);
}
return 0;
}
alex@galene ~ $ cc -Wall -std=c99 -o /tmp/hello /tmp/hello.c
alex@galene ~ $ /tmp/hello
ПрЮвет, мЮр!
alex@galene ~ $ _
Но нужно отчётливо понимать, что этим методом Вы сможете писать в консоль надписи только в текущей локали, что бывает далеко не всегда удобно. Для более сложного вывода, да, перед выводом нужно использовать явную конвертацию в требуемую кодировку. <вброс>Возможно, стоит сразу посмотреть в сторону Qt ;-P</вброс>, там отделение внутреннего представления строк от транспортного уровня сделано очень по-человечески.
Исправление AlexM, :
А, ну и про установку локали не забыть, чтобы подсистема знала, в какую целевую многобайтную кодировку всё транслировать:
alex@galene ~ $ cat >/tmp/hello.c
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
int main(void) {
setlocale(LC_CTYPE, "");
wchar_t greetings[] = L"Привет, мир!\n";
for(wchar_t* p = greetings; *p; ++p) {
if (*p == L'и')
*p = L'Ю';
fputwc(*p, stdout);
}
return 0;
}
alex@galene ~ $ cc -Wall -std=c99 -o /tmp/hello /tmp/hello.c
alex@galene ~ $ /tmp/hello
ПрЮвет, мЮр!
alex@galene ~ $ _
Но нужно отчётливо понимать, что этим методом Вы сможете писать в консоль надписи только в текущей локали, что бывает далеко не всегда удобно. Для более сложного вывода, да, перед выводом нужно использовать явную конвертацию в требуемую кодировку.
Исправление AlexM, :
А, ну и про установку локали не забыть, чтобы подсистема знала, в какую целевую многобайтную кодировку всё транслировать:
alex@galene ~ $ cat >/tmp/hello.c
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
int main(void) {
setlocale(LC_CTYPE, "");
wchar_t greetings[] = L"Привет, мир!\n";
for(wchar_t* p = greetings; *p; ++p) {
if (*p == L'и')
*p = L'Ю';
fputwc(*p, stdout);
}
return 0;
}
alex@galene ~ $ cc -Wall -std=c99 -o /tmp/hello /tmp/hello.c
alex@galene ~ $ /tmp/hello
ПрЮвет, мЮр!
alex@galene ~ $ _
Но нужно отчётливо понимать, что этим методов Вы сможете писать в консоль надписи только в текущей локали, что бывает далеко не всегда удобно. Для более сложного вывода, да, перед выводом нужно использовать явную конвертацию в требуемую кодировку.
Исходная версия AlexM, :
А, ну и про установку локали не забыть, чтобы подсистема знала, в какую целевую многобайтную кодировку всё транслировать:
alex@galene ~ $ cat >/tmp/hello.c
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
int main(void) {
setlocale(LC_CTYPE, "");
wchar_t greetings[] = L"Привет, мир!\n";
for(wchar_t* p = greetings; *p; ++p) {
if (*p == L'и')
*p = L'Ю';
fputwc(*p, stdout);
}
return 0;
}
alex@galene ~ $ cc -Wall -std=c99 -o /tmp/hello /tmp/hello.c
alex@galene ~ $ /tmp/hello
ПрЮвет, мЮр!
alex@galene ~ $ _