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