std::wctomb
Определено в заголовочном файле <cstdlib>
|
||
int wctomb( char *s, wchar_t wc ); |
||
Преобразует широкий символ wc в многобайтовую кодировку и сохраняет его (включая любые последовательности сдвига) в массиве символов, на первый элемент которого указывает s. Сохраняется не более MB_CUR_MAX символов. На преобразование влияет категория LC_CTYPE текущей локали.
Если wc является нулевым символом, нулевой байт записывается в s, которому предшествуют любые последовательности сдвига, необходимые для восстановления исходного состояния сдвига.
Если s является нулевым указателем, сбрасывает глобальное состояние преобразования и определяет, используются ли последовательности сдвига.
Содержание |
[править] Параметры
s | — | указатель на массив символов для вывода |
wc | — | широкий символ для преобразования |
[править] Возвращаемое значение
Если s не является нулевым указателем, возвращает количество байтов, содержащихся в многобайтовом представлении wc или -1, если wc не является допустимым символом.
Если s является нулевым указателем, сбрасывает своё внутреннее состояние преобразования, чтобы представить начальное состояние сдвига, и возвращает 0, если текущая многобайтовая кодировка не зависит от состояния (не использует последовательности сдвига) или ненулевое значение, если текущая многобайтовая кодировка зависит от состояния (использует последовательности сдвига).
[править] Примечание
Каждый вызов wctomb
обновляет внутреннее глобальное состояние преобразования (статический объект типа std::mbstate_t, известный только этой функции). Если многобайтовое кодирование использует состояния сдвига, эта функция не является реентерабельной. В любом случае несколько потоков не должны вызывать wctomb
без синхронизации: вместо этого можно использовать std::wcrtomb.
[править] Пример
#include <iostream> #include <iomanip> #include <clocale> #include <string> #include <cstdlib> void print_wide(const std::wstring& wstr) { bool shifts = std::wctomb(nullptr, 0); // сбросить состояние преобразования std::cout << "последовательности сдвига " << (shifts ? "" : "не" ) << " используются\n" << std::uppercase << std::setfill('0'); for (const wchar_t wc : wstr) { std::string mb(MB_CUR_MAX, '\0'); const int ret = std::wctomb(&mb[0], wc); const char* s = ret > 1 ? "s" : ""; std::cout << "многобайтовый символ '" << mb << "' равен " << ret << " байт" << s << ": [" << std::hex; for (int i{0}; i != ret; ++i) { const int c = 0xFF & mb[i]; std::cout << (i ? " " : "") << std::setw(2) << c; } std::cout << "]\n" << std::dec; } } int main() { std::setlocale(LC_ALL, "en_US.utf8"); // Узкая многобайтовая кодировка UTF-8 std::wstring wstr = L"z\u00df\u6c34\U0001d10b"; // или L"zß水𝄋" print_wide(wstr); }
Вывод:
последовательности сдвига не используются многобайтовый символ 'z' равен 1 байт: [7A] многобайтовый символ 'ß' равен 2 байт: [C3 9F] многобайтовый символ '水' равен 3 байт: [E6 B0 B4] многобайтовый символ '𝄋' равен 4 байт: [F0 9D 84 8B]
[править] Смотрите также
преобразует следующий многобайтовый символ в широкий символ (функция) | |
преобразует широкий символ в его многобайтовое представление при заданном состоянии (функция) | |
[virtual] |
преобразует строку из internT в externT, например, при записи в файл Оригинал: converts a string from internT to externT, such as when writing to file Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (virtual protected std::codecvt функция-элемент)
|
Документация C по wctomb
|