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 <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]
См. также
| преобразует следующий многобайтовый символ в широкий символ (функция) |
|
| преобразует широкий символ в его многобайтовое представление с учётом состояния (функция) |
|
|
[виртуальная] | преобразует строку из InternT в ExternT, например, при записи в файл (виртуальная защищённая функция-член класса std::codecvt<InternT,ExternT,StateT>) |
Документация по C для wctomb |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/multibyte/wctomb