Spec-Zone.ru › C

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

См. также

mbrtowc
(C95)
преобразует следующий многобайтовый символ в широкий символ с учётом состояния
(функция)
mblen
возвращает количество байтов в следующем многобайтовом символе
(функция)
Документация C++ для mbtowc

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/multibyte/mbtowc

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API