std::mbtowc
| Определено в заголовочном файле <cstdlib>
|
||
int mbtowc( wchar_t* pwc, const char* s, std::size_t n ); |
||
Преобразовывает многобайтовый символ, на первый байт которого указывает s, в широкий символ, который записывается в *pwc, если pwc не равен нулевому указателю.
Если s является нулевым указателем, сбрасывает глобальное состояние преобразования и определяет, используются ли последовательности сдвига.
Параметры
| s | — | указатель на многобайтовый символ |
| n | — | ограничение на количество байт в s, которые могут быть проверены |
| pwc | — | указатель на широкий символ для вывода результата |
Возвращаемое значение
Если s не является нулевым указателем, возвращает количество байтов, содержащихся в многобайтовом символе, или -1, если первые байты, на которые указывает s, не формируют допустимый многобайтовый символ или 0, если s указывает на нулевой символ '\0'.
Если s является нулевым указателем, сбрасывает свое внутреннее состояние преобразования, чтобы вернуть начальное состояние сдвига, и возвращает 0, если текущая многобайтовая кодировка не зависит от состояния (не использует последовательности сдвига) или ненулевое значение, если текущая многобайтовая кодировка зависит от состояния (использует последовательности сдвига).
Примечание
Каждый вызов mbtowc обновляет внутреннее глобальное состояние преобразования (статический объект типа std::mbstate_t, известный только этой функции). Если в многобайтовой кодировке используются состояния сдвига, необходимо соблюдать осторожность, чтобы избежать возврата или многократного сканирования. В любом случае несколько потоков не должны вызывать mbtowc без синхронизации: вместо этого можно использовать std::mbrtowc.
Пример
#include <clocale>
#include <cstdlib>
#include <cstring>
#include <iostream>
int print_mb(const char* ptr)
{
std::mbtowc(nullptr, 0, 0); // сбросить состояние преобразования
const char* end = ptr + std::strlen(ptr);
int ret{};
for (wchar_t wc; (ret = std::mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret)
std::wcout << wc;
std::wcout << '\n';
return ret;
}
int main()
{
std::setlocale(LC_ALL, "en_US.utf8");
// Узкая многобайтовая кодировка UTF-8
const char* str = "z\u00df\u6c34\U0001d10b"; // или u8"zß水𝄋"
// или "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
print_mb(str);
}
Вывод:
zß水𝄋
Смотрите также
| преобразует следующий многобайтовый символ в широкий символ при заданном состоянии (функция) | |
| возвращает количество байтов в следующем мультибайтовом символе (функция) | |
[virtual] |
преобразует строку из externT в internT, например, при чтении из файла Оригинал: converts a string from externT to internT, such as when reading from file Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (virtual protected std::codecvt функция-элемент)
|
Документация C по mbtowc
| |