LINUX.ORG.RU

История изменений

Исправление 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 ~ $ _