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
(функция) |
|
[virtual]
|
преобразует строку из
ExternT
в
InternT
, например, при чтении из файла
(виртуальная защищенная функция-член
std::codecvt<InternT,ExternT,StateT>
)
|
|
Документация C
для
mbrtoc16
|
|