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"}; // 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 (функция) |
|
[виртуальная] | преобразует строку из ExternT в InternT, например при чтении из файла (виртуальная защищённая функция-член std::codecvt<InternT,ExternT,StateT>) |
Документация C для mbrtoc16 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/multibyte/mbrtoc16