mbtowc
Defined in header <stdlib.h> |
||
|---|---|---|
int mbtowc( wchar_t *pwc, const char *s, size_t n ) |
(до C99) | |
int mbtowc( wchar_t *restrict pwc, const char *restrict s, size_t n ) |
(с C99) |
Преобразует многобайтовый символ, первый байт которого указан в s, в широкий символ, записанный в *pwc, если pwc не равен null.
Если s является указателем на null, сбрасывает глобальное состояние преобразования и определяет, используются ли последовательности сдвига.
Примечания
Каждый вызов mbtowc обновляет внутреннее глобальное состояние преобразования (статический объект типа mbstate_t, известный только этой функции). Если многобайтовое кодирование использует состояния сдвига, необходимо позаботиться о том, чтобы избежать обратного отслеживания или нескольких сканирований. В любом случае, несколько потоков не должны вызывать mbtowc без синхронизации: вместо этого можно использовать mbrtowc.
Параметры
| pwc | - | указатель на широкий символ для вывода |
| s | - | указатель на многобайтовый символ |
| n | - | ограничение на количество байтов в s, которые могут быть проверены |
Значение возврата
Если s не является указателем на null, возвращает количество байтов, содержащихся в многобайтовом символе, или -1, если первые байты, на которые указывает s, не образуют допустимого многобайтового символа, или 0, если s указывает на нулевой символ '\0'.
Если s является указателем на null, сбрасывает внутреннее состояние преобразования для представления начального состояния сдвига и возвращает 0, если текущее многобайтовое кодирование не зависит от состояния (не использует последовательности сдвига), или ненулевое значение, если текущее многобайтовое кодирование зависит от состояния (использует последовательности сдвига).
Пример
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
// print multibyte string to wide-oriented stdout
// equivalent to wprintf(L"%s\n", ptr);
void print_mb(const char* ptr)
{
mbtowc(NULL, 0, 0); // reset the conversion state
const char* end = ptr + strlen(ptr);
int ret = 0;
for (wchar_t wc; (ret = mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret)
wprintf(L"%lc", wc);
wprintf(L"\n");
}
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
// UTF-8 narrow multibyte encoding
print_mb(u8"z\u00df\u6c34\U0001F34C"); // or u8"zß水🍌"
}Вывод:
zß水🍌
Справочные материалы
- Стандарт C23 (ISO/IEC 9899:2023):
- 7.24.7.2 Функция mbtowc (с: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.22.7.2 Функция mbtowc (с: 260)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.22.7.2 Функция mbtowc (с: 358)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.20.7.2 Функция mbtowc (с: 322)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.10.7.2 Функция mbtowc
См. также
|
(C95) |
преобразует следующий многобайтовый символ в широкий символ, заданное состояние (функция) |
| возвращает количество байтов в следующем многобайтовом символе (функция) |
|
Документация C++ для mbtowc |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/mbtowc