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

std::mbrtoc32

Материал из cppreference.com
 
 
 
Многобайтовые строки с завершающим нулём
Широкие/многобайтовые преобразования
Типы
 
<tbody> </tbody>
Определено в заголовочном файле <cuchar>
std::size_t mbrtoc32( char32_t* pc32, const char* s, std::size_t n, std::mbstate_t* ps );
(начиная с C++11)

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

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

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

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

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

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

Параметры

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

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

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

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

Пример

#include <cassert>
#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 << "Обработка " << str.size() << " байтов: [ " << std::showbase;
    for (unsigned char c : str)
        std::cout << std::hex << +c << ' ';
    std::cout << "]\n";

    std::mbstate_t state{}; // инициализируется нулём в исходное состояние
    char32_t c32;
    const char *ptr = str.c_str(), *end = str.c_str() + str.size() + 1;

    while (std::size_t rc = std::mbrtoc32(&c32, ptr, end - ptr, &state))
    {   
        std::cout << "Следующий UTF-32 символ: " << std::hex
                  << static_cast<int>(c32) << " получен из ";
        assert(rc != (std::size_t) - 3); // нет суррогатов в UTF-32
        if (rc == (std::size_t) - 1)
            break;
        if (rc == (std::size_t) - 2)
            break;
        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-32 символ: 0x7a получен из 1 байтов [ 0x7a ]
Следующий UTF-32 символ: 0xdf получен из 2 байтов [ 0xc3 0x9f ]
Следующий UTF-32 символ: 0x6c34 получен из 3 байтов [ 0xe6 0xb0 0xb4 ]
Следующий UTF-32 символ: 0x1f34c получен из 4 байтов [ 0xf0 0x9f 0x8d 0x8c ]

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

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

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