mbtowc
Определено в заголовочном файле <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 не является нулевым указателем.
Если s является нулевым указателем, сбрасывает глобальное состояние преобразования и определяет, используются ли последовательности переключения.
Примечания
Каждый вызов mbtowc обновляет внутреннее глобальное состояние преобразования (статический объект типа mbstate_t, известный только этой функции). Если в многобайтовой кодировке используются состояния переключения, необходимо избегать возврата к предыдущим позициям и повторного сканирования. В любом случае несколько потоков не должны вызывать mbtowc без синхронизации: вместо неё можно использовать mbrtowc.
Параметры
| pwc | - | указатель на выходной широкий символ |
| s | - | указатель на многобайтовый символ |
| n | - | ограничение на количество байтов в s, которые могут быть просмотрены |
Возвращаемое значение
Если s не является нулевым указателем, возвращает количество байтов, содержащихся в многобайтовом символе, либо -1, если первые байты, на которые указывает s, не образуют допустимый многобайтовый символ, либо 0, если s указывает на нулевой символ '\0'.
Если s является нулевым указателем, сбрасывает своё внутреннее состояние преобразования в исходное состояние переключения и возвращает 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, NULL, 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("z\u00df\u6c34\U0001F34C"); // or "zß水🍌"
}
Вывод:
zß水🍌
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 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/c/string/multibyte/mbtowc