定义
- 多字节字符:多个字节表示一个字符,每个国家不一样,没有统一编码方案;
- 宽字符:Unicode编码方案,4个字节表示一个字符;
C++中,char*
表示多字节字符串,wchar_t*
表示宽字符串
上面两个字符串没法使用强制类型转换
两者的相互转换
使用C标准库函数mbstowcs
和wcstombs
size_t mbstowcs (wchar_t* dest, const char* src, size_t max); //将多字节编码转为宽字节编码
size_t wcstombs(char* dest, const wchar_t* stc, size_t max); //将宽字节转换为多字节编码
上面两个函数转换过程中受系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型,函数
setlocale
进行系统编码的设置,在Unix系统下可以使用locale -a
查看系统支持的编码类型;
使用C++标准库函数实现
多字节字符转宽字节字符
wchar_t* mbs2wcs(const char* srcMbs)
{
if (nullptr == srcMbs || _mbstrlen(srcMbs) == 0)
return nullptr;
size_t size = mbstowcs(nullptr, srcMbs, 0);
if (size <= 0)
return nullptr;
wchar_t* res = (wchar_t*)malloc(size * 2);
auto error = mbstowcs(res, srcMbs, _mbstrlen(srcMbs) * 2);
return res;
}
宽字节字符转多字节字符
char* wcs2mbs(const wchar_t* srcWcs)
{
if (srcWcs == nullptr || wcslen(srcWcs) == 0)
return nullptr;
size_t size = wcstombs(nullptr, srcWcs, 0);
if (size <= 0)
return nullptr;
char* res = (char*)malloc(2 * size);
auto error = wcstombs(res, srcWcs, wcslen(srcWcs) * 2);
return res;
}