std::mbrtoc32
| Определено в заголовочном файле <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 функция-элемент)
|
Документация C по mbrtoc32
| |