Spec-Zone.ru › C++

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ß水𝄋

См. также

mbrtowc
преобразует следующий многобайтовый символ в широкий символ, учитывая состояние
(функция)
mblen
возвращает количество байтов в следующем многобайтовом символе
(функция)
do_in
[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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API