std:: wctomb
|
Определено в заголовочном файле
<cstdlib>
|
||
|
int
wctomb
(
char
*
s,
wchar_t
wc
)
;
|
||
Преобразует широкий символ wc в многобайтовую кодировку и сохраняет его (включая любые сдвиговые последовательности) в массив char, на первый элемент которого указывает 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 <clocale> #include <cstdlib> #include <iomanip> #include <iostream> #include <string> void print_wide(const std::wstring& wstr) { bool shifts = std::wctomb(nullptr, 0); // reset the conversion state std::cout << "shift sequences are " << (shifts ? "" : "not" ) << " used\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 << "multibyte char '" << mb << "' is " << ret << " byte" << 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 narrow multibyte encoding std::wstring wstr = L"z\u00df\u6c34\U0001d10b"; // or L"zß水𝄋" print_wide(wstr); }
Вывод:
shift sequences are not used multibyte char 'z' is 1 byte: [7A] multibyte char 'ß' is 2 bytes: [C3 9F] multibyte char '水' is 3 bytes: [E6 B0 B4] multibyte char '𝄋' is 4 bytes: [F0 9D 84 8B]
Смотрите также
|
преобразует следующий многобайтовый символ в широкий символ
(функция) |
|
|
преобразует широкий символ в его многобайтовое представление с учетом состояния
(функция) |
|
|
[virtual]
|
преобразует строку из
InternT
в
ExternT
, например, при записи в файл
(виртуальная защищенная функция-член
std::codecvt<InternT,ExternT,StateT>
)
|
|
Документация C
для
wctomb
|
|