这是我参与新手入门的第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