Пространства имён
Варианты
Действия

std::wctomb

Материал из cppreference.com
< cpp‎ | string‎ | multibyte
Определено в заголовочном файле <cstdlib>
int wctomb( char *s, wchar_t wc );

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

Если wc - нулевой символ, то в s будет записан null-байт, который будет предшествовать всем последовательностям сдвига регистра, которые необходимы для восстановления первоначального состояния сдвига регистра.

Если s - нулевой указатель, то сбрасывается глобальное состояние сдвига регистра и определяется используется сдвиг регистра или нет.

Содержание

[править] Параметры

s - Указатель на массив символов для вывода
wc - Мультибайтовый символ для конвертирования

[править] Возвращаемое значение

Если s - не нулевой указатель, то тогда возвращается количество байтов, которое было использовано для сохранения мультибайтового представления wc или -1, если wc - некорректный символ.

Если s равен нулевому указателю, то сбрасывается внутреннее состояние преобразования, чтобы вернуть первоначальное состояние сдвига регистра и возвращает 0, если текущая многобайтовая кодировка не является зависимой от состояния регистра (не использует последовательность сдвига регистра) или ненулевое значение, если она зависит от этого состояния (использует сдвиг регистра).

[править] Примечание

Каждый вызов wctomb обновляет глобальное внутреннее состояние преобразования (в статическом объекте типа std::mbstate_t, известного только этой функции). Если многобайтовая кодировка использует сдвиг регистра необходимо соблюдать осторожность, чтобы не допустить возвратов или повторного сканирования. В любом случае, из нескольких поток не следует запускать wctomb без синхронизации: в противном случае можно воспользоваться std::wcrtomb.

[править] Пример

#include <iostream>
#include <clocale>
#include <string>
#include <cstdlib>
 
void print_wide(const std::wstring& wstr)
{
    bool shifts = std::wctomb(NULL, 0); // Сброс состояния сдвига регистра
    std::cout << "Сдвиг регистра " << (shifts ? "" : "не" ) << " используется\n";
    for (wchar_t wc : wstr) {
        std::string mb(MB_CUR_MAX, '\0');
        int ret = std::wctomb(&mb[0], wc);
        std::cout << "Мультибайтовый символ " << mb << " занимает " << ret << " байт\n";
    }
}
 
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    // мультибайтовое кодирование UTF8
    std::wstring wstr = L"z\u00df\u6c34\U0001d10b"; // или L"zß水𝄋"
    print_wide(wstr);
}

Вывод:

Сдвиг регистра не используется
Мультибайтовый символ занимает 1 байт
Мультибайтовый символ ß занимает 2 байт
Мультибайтовый символ 水 занимает 3 байт
Мультибайтовый символ 𝄋 занимает 4 байт

[править] См. также

Преобразует заданный мультибайтовый символ в широкий символ
(функция) [править]
преобразует широкий символ в своем многобайтовых представление, данное состояние
Оригинал:
converts a wide character to its multibyte representation, given state
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(функция) [править]
[virtual]
преобразует строку из internT в externT, например, при записи в файл
Оригинал:
converts a string from internT to externT, such as when writing to file
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(virtual protected std::codecvt функция-член) [править]
C documentation for wctomb