Пространства имён
Варианты
Действия

std::mbtowc

Материал из cppreference.com
< cpp‎ | string‎ | multibyte
 
 
 
Многобайтовые строки с завершающим нулём
Широкие/многобайтовые преобразования
mbtowc
(C++20)
(C++11)
(C++11)    
Типы
 
Определено в заголовочном файле <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"; // или u8"zß水𝄋"
                      // или "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

Вывод:

zß水𝄋

[править] Смотрите также

преобразует следующий многобайтовый символ в широкий символ при заданном состоянии
(функция) [править]
возвращает количество байтов в следующем мультибайтовом символе
(функция) [править]
[virtual]
преобразует строку из externT в internT, например, при чтении из файла
Оригинал:
converts a string from externT to internT, such as when reading from file
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(virtual protected std::codecvt функция-элемент) [править]