Функции библиотеки C -mbstowcs()
Стандартная библиотека C - <stdlib.h>
Описание
Функции библиотеки CmbstowcsИспользуется для преобразования многобайтовой строки в строку широких символов.
mbstowcsФункция определена в заголовочном файле <stdlib.h>.
Объявление
Ниже приведено объявление функции mbstowcs().
size_t mbstowcs(wchar_t *pwcs, const char *mbs, size_t n);
Параметр
pwcs: Указывает на буфер, используемый для хранения преобразованной строки широких символов. Еслиpwcsравен NULL, функция возвращает требуемую длину буфера, не выполняя фактическое преобразование.mbs: Указатель на многобайтовую строку.n: Максимальное число символов для преобразования. Если до обнаружения завершающего символа преобразование уже было выполненоnсимволов, преобразование прекращается досрочно.
Возвращаемое значение
- В случае успеха возвращает количество преобразованных широких символов, не считая завершающего нулевого символа.
- Если обнаружена недопустимая многобайтовая последовательность, возвращает
(size_t)-1, и устанавливаетerrno。
Пример
Следующий пример демонстрирует использование функции mbstowcs().
Пример 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int len;
char *pmbnull = NULL;
char *pmb = (char *)malloc( MB_CUR_MAX );
wchar_t *pwc = L"Hi";
wchar_t *pwcs = (wchar_t *)malloc( sizeof( wchar_t ));
printf("Преобразовать в многобайтовую строку\n");
len = wcstombs( pmb, pwc, MB_CUR_MAX);
printf("Преобразованный символ %d\n", len);
printf("Шестнадцатеричное значение первого многобайтового символа: %#.4x\n", pmb);
printf("Преобразовать обратно в строку широких символов\n");
len = mbstowcs( pwcs, pmb, MB_CUR_MAX);
printf("Преобразованный символ %d\n", len);
printf("Шестнадцатеричное значение первого широкого символа: %#.4x\n\n", pwcs);
return(0);
}
Давайте скомпилируем и запустим приведённую выше программу, которая выдаст следующий результат:
转换为多字节字符串 被转换的字符 1 第一个多字节字符的十六进制值:0x19a60010 转换回宽字符字符串 被转换的字符 1 第一个宽字符的十六进制值:0x19a60030
Пример 2
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
int main() {
// Установить текущую локаль в локаль, указанную переменной окружения пользователя
setlocale(LC_ALL, "");
// Определить многобайтовую строку
const char *mbstr = "Hello, world!";
// Вычислить требуемый размер буфера
size_t wcs_len = mbstowcs(NULL, mbstr, 0) + 1;
// Выделить буфер широких символов
wchar_t *wcs = (wchar_t *)malloc(wcs_len * sizeof(wchar_t));
if (wcs == NULL) {
perror("malloc");
return 1;
}
// Выполнить преобразование
mbstowcs(wcs, mbstr, wcs_len);
// Вывести строку широких символов
wprintf(L"%ls\n", wcs);
// освободить память
free(wcs);
return 0;
}
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
int main() {
// Установить текущую локаль в локаль, указанную переменной окружения пользователя
setlocale(LC_ALL, "");
// Определить многобайтовую строку
const char *mbstr = "Hello, world!";
// Вычислить требуемый размер буфера
size_t wcs_len = mbstowcs(NULL, mbstr, 0) + 1;
// Выделить буфер широких символов
wchar_t *wcs = (wchar_t *)malloc(wcs_len * sizeof(wchar_t));
if (wcs == NULL) {
perror("malloc");
return 1;
}
// Выполнить преобразование
mbstowcs(wcs, mbstr, wcs_len);
// Вывести строку широких символов
wprintf(L"%ls\n", wcs);
// освободить память
free(wcs);
return 0;
}
Давайте скомпилируем и запустим приведённую выше программу, которая выдаст следующий результат:
Hello, 世界!
Примечания
- Локаль: На поведение функции влияет текущая
localeнастройка, обычно при вызовеmbstowcsНеобходимо вызватьsetlocaleчтобы установить соответствующийlocale。 - Обработка ошибок: Если входная многобайтовая строка содержит недопустимую многобайтовую последовательность, функция возвращает
(size_t)-1и устанавливаетerrno. Вызывающему необходимо проверить возвращаемое значение и обработать возможные ошибки. - Выделение памяти: Вызывающий должен убедиться
pwcsДостаточно места для хранения преобразованной строки широких символов. Это можно сделать, сначала вызвавmbstowcs, затемpwcsУстановить вNULLчтобы вычислить требуемый размер буфера.