使用C标准函数库实现多字节和宽字节的转换

定义

  • 多字节字符:多个字节表示一个字符,每个国家不一样,没有统一编码方案;
  • 宽字符:Unicode编码方案,4个字节表示一个字符;

C++中,char*表示多字节字符串,wchar_t*表示宽字符串

上面两个字符串没法使用强制类型转换

两者的相互转换

使用C标准库函数mbstowcswcstombs

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;
}
posted @ 2020-03-05 19:49  醉曦  阅读(569)  评论(0编辑  收藏  举报