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 u8"zß水𝄋"
// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
print_mb(str);
}Вывод:
zß水𝄋
См. также
| преобразует следующий многобайтовый символ в широкий символ, учитывая состояние (функция) |
|
| возвращает количество байтов в следующем многобайтовом символе (функция) |
|
|
[virtual] |
преобразует строку из 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/w/cpp/string/multibyte/mbtowc