IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    string转wstring,wstring转string,utf8转utf16,utf16转utf8

    admin发表于 2016-05-11 05:38:50
    love 0

    string转wstring,wstring转string,utf8转utf16,utf16转utf8

    为了节省存储空间,一般我们的文件或者数据使用UTF-8保存或传输。但是当我们需要对单个字符逐个处理的时候,UTF-8的变长存储又略显不便,此时可能需要转换到UTF-16,这样每个字都是wchar_t固定双字节长度,比较好操作。幸运的是,我们无需借助其他工具,C++标准库中就提供了这样的转换函数。

    注意 使用这些转换函数之前必须要调用 setlocale() 设置环境locale,例如:

    setlocale(LC_CTYPE, "en_US.utf-8");

    比如,把保存在std::string中的UTF-8字节流转换成UTF-16并保存在std::wstring中:

    std::wstring s2ws(const std::string& s)
    {
        const char* str = s.c_str();
        size_t len = s.size() + 1;
        wchar_t *wstr = new wchar_t[len];
        std::mbsrtowcs(wstr, str, len);
        std::wstring ret(wstr);
        delete [] wstr;
        return ret;
    }
    
    相反,从std::wstring转换到std::string:
    std::string ws2s(const std::wstring& ws)
    {
        const wchar_t* wstr = ws.c_str();
        size_t len = 2 * ws.size() + 1;
        char *str = new char[len];
        std::wcsrtombs(str, wstr, len);
        std::string ret(str);
        delete [] str;
        return ret;
    }

    用下面这个函数可以计算一个UTF-8字符串里的字符个数:

    int mbstrlen(const char* mbstr)
    {
        std::mbstate_t state = std::mbstate_t();
        return std::mbsrtowcs(NULL, &mbstr, 0, &state);
    }

    原文链接:http://blog.jqian.net/post/wstring.html



沪ICP备19023445号-2号
友情链接