Namespaces
Variants

mbtowc

From cppreference.net
Определено в заголовочном файле <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++ documentation для mbtowc