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

std::wctomb

Материал из cppreference.com
< cpp‎ | string‎ | multibyte
 
 
 
Многобайтовые строки с завершающим нулём
Широкие/многобайтовые преобразования
Типы
 
Определено в заголовочном файле <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 функция-элемент) [править]