LINUX.ORG.RU

вопрос про wchar_t


0

0

задумал я тут программы писать с юникодом, понятно, есть wchar.h, printf("ls.. , fgetwc и так далее. А вот как быть со строками? раньше писал char* msg="message"; а с wchar_t как?

★★

wchar_t *x = L"super_string";

cpu
()

Я прошелся по этим граблям. Как писать строки тебе уже подсказали, вот некоторые другие проблемы которые могут возникнуть:

Для преобразования из юникода в местную кодировку и назад используются функции wcstombs и mbstowcs. Они не будут работать если в программе не установлена локаль (setlocale).

Кодировка и размер wchar_t системно зависимы. В Linux'е sizeof(wchat_t) == 4, в Windows sizeof(wchar_t) == 2. Соответственно в Linux'е используется кодировка UCS-4 а в Windows - UCS-2. Поэтому в файлах wchar_t лучше не хранить и по сети не передавать. В качестве транспортной кодировки лучше использовать UTF-8. Переводить из UTF-8 в UCS-4 (и UCS-2) и наоборот очень просто, iconv для этого не нужен. Алгоритм можно легко найти в интернете или исходниках glib.

В Си++ вместо std::cout надо использовать std::wcout, остальные потоки по аналогии. Вместо std::string соответственно std::wstring.

Если интерисует переносимость в Windows то есть проблемы с mingw. С wchar_t mingw работает без проблем, но есть сложности с C++. Текущая версия mingw не поддерживает std::wstring, но его поддерживает текущий снапшот, взять его можно здесь:

http://www63.tok2.com/home/bitwalk/download.html

std::wstring в нем работает, но не работают потоки ввода-вывода рассчитанные на юникод, например, нет std::wcout, std::wostringstream и т.п. Это неудобно но не смертельно: можно самому определить оператор << для std::ostream и std::wstring, это частично решит проблему вывода. Для ввода аналогично.

asso_w
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.