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

std::mbrtoc16

Материал из cppreference.com
 
 
 
Многобайтовые строки с завершающим нулём
Широкие/многобайтовые преобразования
Типы
 
<tbody> </tbody>
Определено в заголовочном файле <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"; // или u8"zß水🍌"

    std::cout << "Обработка " << str.size() << " байтов: [ " << std::showbase;
    for (unsigned char c: str)
        std::cout << std::hex << +c << ' ';
    std::cout << "]\n";

    std::mbstate_t 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 << "Следующий UTF-16 символ: " << std::hex 
                  << static_cast<int>(c16) << " получен из ";
        if (rc == (std::size_t)-3)
            std::cout << "более ранней суррогатной пары\n";
        else if (rc == (std::size_t) - 2)
            break;
        else if (rc == (std::size_t) - 1)
            break;
        else
        {
            std::cout << std::dec << rc << " байтов [ ";
            for (std::size_t n = 0; n < rc; ++n)
                std::cout << std::hex << +static_cast<unsigned char>(ptr[n]) << ' ';
            std::cout << "]\n";
            ptr += rc;
        }
    }
}

Вывод:

Обработка 10 байтов: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c ]
Следующий UTF-16 символ: 0x7a получен из 1 байтов [ 0x7a ]
Следующий UTF-16 символ: 0xdf получен из 2 байтов [ 0xc3 0x9f ]
Следующий UTF-16 символ: 0x6c34 получен из 3 байтов [ 0xe6 0xb0 0xb4 ]
Следующий UTF-16 символ: 0xd83c получен из 4 байтов [ 0xf0 0x9f 0x8d 0x8c ]
Следующий UTF-16 символ: 0xdf4c получен из более ранней суррогатной пары

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

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

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