C++11 wstring、string、utf-8、utf-16之间的相互转换

// C++11_wstring_string.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <locale>
#include <codecvt>
#include <iostream>
#include <string>
#include <windows.h>

std::wstring StringToWString(const std::string &str)
{
    LPCSTR pszSrc = str.c_str();
    int nLen = ::MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, 0);
    if (nLen == 0)
        return std::wstring(L"");

    wchar_t* pwszDst = new wchar_t[nLen];
    if (!pwszDst)
        return std::wstring(L"");

    ::MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen);
    std::wstring wstr(pwszDst);
    delete[] pwszDst;
    pwszDst = NULL;

    return wstr;
}

std::string WStringToString(const std::wstring &wstr)
{
    LPCWSTR pwszSrc = wstr.c_str();
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
    if (nLen == 0)
        return std::string("");

    char* pszDst = new char[nLen];
    if (!pszDst)
        return std::string("");

    WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
    std::string str(pszDst);
    delete[] pszDst;
    pszDst = NULL;
    return str;
}


int _tmain(int argc, _TCHAR* argv[])
{   
    std::string strTmp = "测试 C++11 宽字符转换。";
    // wstring与utf-8及utf-16转换
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>  convertor_utf;
    // wstring宽窄字符的转换
    std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> conv(new std::codecvt<wchar_t, char, std::mbstate_t>("CHS"));
    // C++11 std 方式转换 
    std::wstring wstrTmp1 = conv.from_bytes(strTmp);
    // WindowsApi 方式转换
    std::wstring wstrTmp2 = StringToWString(strTmp);

    // 设置当地语言
    std::wcout.imbue(std::locale("chs"));
    // 输出wstring需要 wcout
    std::wcout << "WSTRING: \t" << wstrTmp2 << wstrTmp1 << std::endl;
    // wstring转换为string
    std::string strTmp2 = conv.to_bytes(wstrTmp1);
    std::cout << "C++11 wstring 转换为 string\t" << strTmp2 << std::endl;

    std::string strTmp3 = WStringToString(wstrTmp2);
    std::cout << "WindowsAPI wstring 转换为 string\t" << strTmp3 << std::endl;

    system("pause");
	return 0;
}

转UTF-8实例如下,要注意的是,工程中转了之后还要从wstring转换成string

// Unicode转为wstring类型 支持中文 2018/09/06_byWsl
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide = converter.from_bytes(strHostName);
strncpy(pMsg->szHosts[nNum].szHostName, WStringToString(wide).c_str(), sizeof(pMsg->szHosts[nNum]) - 1);

猜你喜欢

转载自blog.csdn.net/Lasuerte/article/details/82458993
今日推荐