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