std::mbtowc
Объявлено в заголовочном файле <cstdlib> | ||
|---|---|---|
int mbtowc( wchar_t* pwc, const char* s, std::size_t n ); |
Преобразует многобайтовый символ, первый байт которого указывает s, в широкий символ, записываемый в *pwc, если pwc не является нулевым указателем.
Если s является нулевым указателем, сбрасывает глобальное состояние преобразования и определяет, используются ли последовательности переключения.
Параметры
| s | - | указатель на многобайтовый символ |
| n | - | ограничение на количество байтов в s, которые могут быть просмотрены |
| pwc | - | указатель на выходной широкий символ |
Возвращаемое значение
Если s не является нулевым указателем, возвращает количество байтов, содержащихся в многобайтовом символе, или -1, если байты, на которые указывает s, не образуют допустимый многобайтовый символ, или 0, если s указывает на нулевой символ '\0'.
Если s является нулевым указателем, сбрасывает внутреннее состояние преобразования в исходное состояние сдвига и возвращает 0, если текущая многобайтовая кодировка не зависит от состояния (не использует последовательности переключения), или ненулевое значение, если текущая многобайтовая кодировка зависит от состояния (использует последовательности переключения).
Примечания
Каждый вызов mbtowc обновляет внутреннее глобальное состояние преобразования (статический объект типа std::mbstate_t, известный только этой функции). Если многобайтовая кодировка использует состояния сдвига, необходимо избегать возврата назад и многократного сканирования. В любом случае нескольким потокам не следует вызывать mbtowc без синхронизации: вместо этого можно использовать std::mbrtowc.
Пример
#include <clocale>
#include <cstdlib>
#include <cstring>
#include <iostream>
int print_mb(const char* ptr)
{
std::mbtowc(nullptr, 0, 0); // reset the conversion state
const char* end = ptr + std::strlen(ptr);
int ret{};
for (wchar_t wc; (ret = std::mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret)
std::wcout << wc;
std::wcout << '\n';
return ret;
}
int main()
{
std::setlocale(LC_ALL, "en_US.utf8");
// UTF-8 narrow multibyte encoding
const char* str = "z\u00df\u6c34\U0001d10b"; // or "zß水𝄋"
// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
print_mb(str);
}
Вывод:
zß水𝄋
См. также
| преобразует следующий многобайтовый символ в широкий символ с учетом состояния (функция) |
|
| возвращает количество байтов в следующем многобайтовом символе (функция) |
|
|
[виртуальная] | преобразует строку из ExternT в InternT, например при чтении из файла (виртуальная защищенная функция-член класса std::codecvt<InternT,ExternT,StateT>) |
Документация C для mbtowc |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/multibyte/mbtowc