Spec-Zone.ru › C

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

См. также

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

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

Spec-Zone.ru

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