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
|