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 <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 функция-элемент)
|
Документация C по wctomb
| |