简析 mbstowcs() & wcstombs()

这是我参与新手入门的第3篇文章

mbstowcs()

size_t mbstowcs(schar_t *pwcs, const char *str, size_t n)
复制代码

参数说明

  • pwds — 指向一个 wchar_t 元素的数组,数组长度足以存储一个最大字符长度的宽字符串。
  • str — 要被转换的多字节字符字符串。
  • n — 可被转换的最大字符数。

返回说明

  • 返回转换为参数 pwcs 所指向的数组。

通过该函数可以将多字节字符转换成宽字符

Example

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <wchar.h>
 
int main(void)
{
         
	strcpy(utf8_str, "12345");
	int strlen = 10;
	size_t len = strlen(utf8_str) + 1;
	wchar_t *wstr = malloc(len * sizeof(wchar_t));

	if (!wstr) {
		return -1;
	}
	len = mbstowcs(wstr, utf8_str, len);
	wstr[len] = 0;
	free(wstr);
	return ret;
}
复制代码

wcstombs()

把宽字符把转换成多字节字符串

size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count);
复制代码

参数说明

  • mbstr — 指向一个 char 元素的数组,数组长度足以存储一个最大字符长度的字符串。
  • str — 要被转换的宽字符字符串。
  • n — 可被转换的最大字符数。

返回说明

  • 返回转换为参数 mbstr 所指向的数组。

Example

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <wchar.h>
 
int main(void)
{
    Object str, newstr;
	const size_t len = wcstombs(NULL, str->value.wstring, 0) + 1;

	String_Realloc(newstr, len);
	wcstombs(newstr->value.string, str->value.wstring, len);

}
复制代码

使用场景

Win:

   1、Unicode转换为ANSI使用:MultiByteToWideChar。

   2、ANSI转换为Unicode使用:WideCharToMultiByte。
复制代码

Linux:

宽字符转多字符:

   size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );
复制代码

多字符转宽字符:

   size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count );
复制代码

需要注意的是,不同的平台中,宽字节和多字节字符的实现方式不同,比如wchar_t 类型采用Unicode编码方式实现,而Unicode其在Windows中为utf-16,在Linux中为utf-32。

而多字节有多种实现方式,如utf-8、ACSII等

因此,如果想要转换成想要转换的编码,需要在调用前,调用setlocale()函数设置编码方式,指定多字节编码类型。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享