std::mbtowc
Определено в заголовочном файле <cstdlib> | ||
int mbtowc(wchar_t* pwc, constchar* 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(constchar* ptr){ std::mbtowc(nullptr, 0, 0);// сбросить состояние преобразованияconstchar* 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-8constchar* 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 |