Spec-Zone.ru › C++

std::wctomb

Defined in header <cstdlib>
int wctomb( char* s, wchar_t wc );

Преобразует широкий символ wc в многобайтовую кодировку и сохраняет его (включая все последовательности смены состояния) в массиве символов, первый элемент которого указан s. Сохраняется не более MB_CUR_MAX символов.

Если 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]

См. также

mbtowc
преобразует следующий многобайтовый символ в широкий символ
(функция)
wcrtomb
преобразует широкий символ в его многобайтовое представление, учитывая состояние
(функция)
do_out
[virtual]
преобразует строку из 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/w/cpp/string/multibyte/wctomb

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API