кодировка putwchar / getwchar?

#c #linux #winapi #unicode #posix

#c #linux #winapi #юникод #posix

Вопрос:

Я пишу код, который работает как на Windows, так и на Linux. Приложение работает со строками в юникоде, и я хочу вывести их на консоль, используя общий код.

Будут ли putwchar и getwchar делать трюк? Например, могу ли я предоставить этим функциям значения символов в юникоде, и они оба будут отображать один и тот же символ в Linux и Windows?

Ответ №1:

Вы собираетесь войти в мир боли. Неизменно консоли * nix предпочитают, чтобы вы отправляли им данные char в кодировке UTF-8.

Windows, с другой стороны, использует UTF-16 для своих API-интерфейсов Unicode, а для консольных API-интерфейсов, я полагаю, он ограничен UCS2.

Вероятно, вам нужно найти какой-нибудь библиотечный код, который абстрагирует различия для вас. У меня нет хорошей рекомендации для вас, но я уверен, что putwchar и getwchar не являются решением.

Комментарии:

1. «Вы собираетесь войти в мир боли». Это мягко сказано.

Ответ №2:

Один из многих способов их согласования — использовать явные режимы преобразования в Windows:

 #ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
int main()
{
#ifdef _WIN32
   _setmode(_fileno(stdout), _O_WTEXT);
#else
    setlocale(LC_ALL, "en_US.UTF-8");
#endif
   fputws(L"Кошкаn", stdout);
}
  

протестировано с помощью gcc 4.6.1 в Linux и Visual Studio 2010 в Windows

_O_U8TEXT В Windows _O_U16TEXT также есть и . Ваш пробег может отличаться.

Ответ №3:

Смотрите putwchar справочную страницу в Linux. В нем говорится, что поведение зависит от LC_CTYPE и говорит: «Разумно ожидать, что putwchar() фактически запишет многобайтовую последовательность, соответствующую широкому символу wc». Аналогично, getwchar() следует прочитать многобайтовую последовательность из стандартного ввода и вернуть ее как широкий символ.

Не предполагайте, что они будут считывать / записывать постоянное количество байтов, как в UCS2.

Все это говорит о том, что посимвольный ввод-вывод обычно не является самым быстрым решением, и когда вы начнете оптимизацию, имейте в виду, что в Linux и Unix вы будете работать в UTF-8.