Namespaces
Variants

std:: mbtowc

From cppreference.net
Определено в заголовочном файле <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); // сбросить состояние конвертации
    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 узкая многобайтовая кодировка
    const char* str = "z\u00df\u6c34\U0001d10b"; // или "zß水𝄋"
                      // или "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

Вывод:

zß水𝄋

Смотрите также

преобразует следующий многобайтовый символ в широкий символ с учётом состояния
(функция)
возвращает количество байт в следующем многобайтовом символе
(функция)
[virtual]
преобразует строку из ExternT в InternT , например, при чтении из файла
(виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT> )