Namespaces
Variants

std:: mbrtoc16

From cppreference.net
Определено в заголовке <cuchar>
std:: size_t mbrtoc16 ( char16_t * pc16, const char * s,
std:: size_t n, std:: mbstate_t * ps ) ;
(начиная с C++11)

Преобразует узкий многобайтовый символ в представление символа UTF-16.

Если s не является нулевым указателем, анализирует не более n байт многобайтовой символьной строки, начиная с байта, на который указывает s , чтобы определить количество байт, необходимых для завершения следующего многобайтового символа (включая любые последовательности сдвига). Если функция определяет, что следующий многобайтовый символ в s является полным и корректным, преобразует его в соответствующий 16-битный символ и сохраняет его в * pc16 (если pc16 не является нулевым указателем).

Если многобайтовый символ в * s соответствует последовательности из нескольких char16_t (например, суррогатной паре в UTF-16), то после первого вызова этой функции * ps обновляется таким образом, что следующий вызов mbrtoc16 запишет дополнительный char16_t , не обращаясь к * s .

Если s является нулевым указателем, значения n и pc16 игнорируются, и вызов эквивалентен std :: mbrtoc16 ( nullptr, "" , 1 , ps ) .

Если широкий символ, полученный в результате, является нулевым символом, состояние преобразования * ps представляет начальное состояние сдвига.

Многобайтовая кодировка, используемая этой функцией, определяется текущей активной локалью C.

Содержание

Параметры

pc16 - указатель на место, куда будет записан результирующий 16-битный символ
s - указатель на многобайтовую строку символов, используемую в качестве входных данных
n - ограничение на количество байтов в s, которые могут быть проверены
ps - указатель на объект состояния преобразования, используемый при интерпретации многобайтовой строки

Возвращаемое значение

Первое из следующих применимых условий:

  • 0 если символ, преобразованный из s (и сохранённый в * pc16 если не нулевой), был нулевым символом.
  • количество байт [ 1 , n ] многобайтового символа, успешно преобразованного из s .
  • - 3 если следующий char16_t из многобайтового char16_t символа (например, суррогатной пары) был записан в * pc16 . В этом случае никакие байты из входных данных не обрабатываются.
  • - 2 если следующие n байт представляют неполный, но пока корректный многобайтовый символ. Ничего не записывается в * pc16 .
  • - 1 при ошибке кодирования. Ничего не записывается в * pc16 , значение EILSEQ сохраняется в errno , а значение * ps становится неопределённым.

Пример

#include <clocale>
#include <cstring>
#include <cuchar>
#include <cwchar>
#include <iomanip>
#include <iostream>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::string str{"z\u00df\u6c34\U0001F34C"}; // or u8"zß水🍌"
    std::cout << "Processing " << str.size() << " bytes: [" << std::uppercase
              << std::setfill('0') << std::hex;
    for (int n{}; unsigned char c : str)
        std::cout << (n++ ? " " : "") << +c;
    std::cout << "]\n";
    std::mbstate_t state{}; // zero-initialized to initial state
    char16_t c16{};
    const char* ptr{&str[0]}, *end{&str[0] + str.size()};
    while (std::size_t rc{std::mbrtoc16(&c16, ptr, end - ptr + 1, &state)})
    {
        std::cout << "Next UTF-16 char: " << std::setw(4)
                  << static_cast<unsigned short>(c16) << " obtained from ";
        if (rc == std::size_t(-3))
            std::cout << "earlier surrogate pair\n";
        else if (rc == std::size_t(-2))
            continue;
        else if (rc == std::size_t(-1))
            break;
        else
        {
            std::cout << std::dec << rc << " bytes [";
            for (std::size_t n{}; n != rc; ++n)
                std::cout << (n ? " " : "") << std::hex
                          << +static_cast<unsigned char>(ptr[n]);
            std::cout << "]\n";
            ptr += rc;
        }
    }
}

Вывод:

Processing 10 bytes: [7A C3 9F E6 B0 B4 F0 9F 8D 8C]
Next UTF-16 char: 007A obtained from 1 bytes [7A]
Next UTF-16 char: 00DF obtained from 2 bytes [C3 9F]
Next UTF-16 char: 6C34 obtained from 3 bytes [E6 B0 B4]
Next UTF-16 char: D83C obtained from 4 bytes [F0 9F 8D 8C]
Next UTF-16 char: DF4C obtained from earlier surrogate pair

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

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