mbrtowc
|
Определено в заголовочном файле
<wchar.h>
|
||
| (начиная с C95) | ||
| (начиная с C99) | ||
Преобразует узкий многобайтовый символ в его широкосимвольное представление.
Если
s
не является нулевым указателем, анализирует не более
n
байт многобайтовой строки символов, начиная с байта, на который указывает
s
, чтобы определить количество байт, необходимых для завершения следующего многобайтового символа (включая любые последовательности сдвига, и с учётом текущего состояния многобайтового преобразования
*
ps
). Если функция определяет, что следующий многобайтовый символ в
s
является полным и корректным, преобразует его в соответствующий широкий символ и сохраняет в
*
pwc
(если
pwc
не является нулевым указателем).
Если
s
является нулевым указателем, значения
n
и
pwc
игнорируются, и вызов эквивалентен
mbrtowc
(
NULL
,
""
,
1
, ps
)
.
Если широкий символ, полученный в результате, является нулевым символом, состояние преобразования, хранящееся в * ps является начальным состоянием сдвига.
Если определён макрос окружения __STDC_ISO_10646__ , значения типа wchar_t совпадают с короткими идентификаторами символов обязательного набора Unicode (обычно кодировка UTF-32); в противном случае это определяется реализацией. В любом случае, многобайтовая кодировка символов, используемая этой функцией, задаётся текущей активной локалью C.
Содержание |
Параметры
| pwc | - | указатель на место, куда будет записан результирующий широкий символ |
| s | - | указатель на строку многобайтовых символов, используемую в качестве входных данных |
| n | - | ограничение на количество байт в s, которые могут быть проверены |
| ps | - | указатель на состояние преобразования, используемое при интерпретации строки многобайтовых символов |
Возвращаемое значение
Первое из следующих условий, которое применяется:
-
0
если символ, преобразованный из
s(и сохранённый в pwc если не null), был нулевым символом -
количество байт
[
1
...
n
]
многобайтового символа, успешно преобразованного из
s -
(
size_t
)
-
2
если следующие
nбайт составляют неполный, но пока корректный многобайтовый символ. Ничего не записывается в * pwc . -
(
size_t
)
-
1
если произошла ошибка кодировки. Ничего не записывается в
*pwc, значение EILSEQ сохраняется в errno и значение * ps остаётся неопределённым.
Пример
#include <stdio.h> #include <locale.h> #include <string.h> #include <wchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); mbstate_t state; memset(&state, 0, sizeof state); char in[] = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu UTF-8 code units: [ ", in_sz); for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned char)in[n]); puts("]"); wchar_t out[in_sz]; char *p_in = in, *end = in + in_sz; wchar_t *p_out = out; int rc; while((rc = mbrtowc(p_out, p_in, end - p_in, &state)) > 0) { p_in += rc; p_out += 1; } size_t out_sz = p_out - out + 1; printf("into %zu wchar_t units: [ ", out_sz); for(size_t x = 0; x < out_sz; ++x) printf("%#x ", out[x]); puts("]"); }
Вывод:
Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ] into 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.29.6.3.2 Функция mbrtowc (стр. 443)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.24.6.3.2 Функция mbrtowc (стр. 389)
Смотрите также
|
преобразует следующий многобайтовый символ в широкий символ
(функция) |
|
|
(C95)
(C11)
|
преобразует широкий символ в его многобайтовое представление с учётом состояния
(функция) |
|
Документация C++
для
mbrtowc
|
|