C++ UTF-8编码与解码

时间:2023-01-06 11:57:45
求C++ UTF-8编码与解码函数?
如“大家好”<=>e5a4a7e5aeb6e5a5bd20  
谢谢!

21 个解决方案

#2


不能转换呀

error C2440: 'type cast' : cannot convert from 'ATL::CString' to 'LPCSTR'

error C2664: 'MultiByteToWideChar' : cannot convert parameter 3 from 'ATL::CString' to 'LPCSTR'

error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [3]' to 'const wchar_t *'

#3


下列函数是我工程里用的。
先转换到Unicode,再到UTF-8,反之也一样。
qp::StringW Global::AnsiToUnicode(const char* buf)
{
    int len = ::MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
    if (len == 0) return L"";

    std::vector<wchar_t> unicode(len);
    ::MultiByteToWideChar(CP_ACP, 0, buf, -1, &unicode[0], len);

    return &unicode[0];
}

qp::StringA Global::UnicodeToAnsi(const wchar_t* buf)
{
    int len = ::WideCharToMultiByte(CP_ACP, 0, buf, -1, NULL, 0, NULL, NULL);
    if (len == 0) return "";

    std::vector<char> utf8(len);
    ::WideCharToMultiByte(CP_ACP, 0, buf, -1, &utf8[0], len, NULL, NULL);

    return &utf8[0];
}

qp::StringW Global::Utf8ToUnicode(const char* buf)
{
    int len = ::MultiByteToWideChar(CP_UTF8, 0, buf, -1, NULL, 0);
    if (len == 0) return L"";

    std::vector<wchar_t> unicode(len);
    ::MultiByteToWideChar(CP_UTF8, 0, buf, -1, &unicode[0], len);

    return &unicode[0];
}

qp::StringA Global::UnicodeToUtf8(const wchar_t* buf)
{
    int len = ::WideCharToMultiByte(CP_UTF8, 0, buf, -1, NULL, 0, NULL, NULL);
    if (len == 0) return "";

    std::vector<char> utf8(len);
    ::WideCharToMultiByte(CP_UTF8, 0, buf, -1, &utf8[0], len, NULL, NULL);

    return &utf8[0];
}

#4


Up老邓

#5


用我的吧 标准c++的、


#include "stdafx.h"
#include <string>
#include <clocale>
using namespace std;

#include "charsetCvt.h"
string ws2s(const wstring& ws)
{
string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
setlocale(LC_ALL, "chs"); 
const wchar_t* _Source = ws.c_str();
size_t _Dsize = 2 * ws.size() + 1;
char *_Dest = new char[_Dsize];
memset(_Dest,0,_Dsize);
wcstombs(_Dest,_Source,_Dsize);
string result = _Dest;
delete []_Dest;
setlocale(LC_ALL, curLocale.c_str());
return result;
}
 

wstring s2ws(const string& s)
{
setlocale(LC_ALL, "chs"); 
const char* _Source = s.c_str();
size_t _Dsize = s.size() + 1;
wchar_t *_Dest = new wchar_t[_Dsize];
wmemset(_Dest, 0, _Dsize);
int nret = mbstowcs(_Dest,_Source,_Dsize);
wstring result = _Dest;
delete []_Dest;
setlocale(LC_ALL, "C");
 
return result;

}


 
wstring UTF2Uni(const char* src, std::wstring &t)
{
if (src == NULL) 
{
return L"";
}

int size_s = strlen(src);
int size_d = size_s + 10;          //?

wchar_t *des = new wchar_t[size_d];
memset(des, 0, size_d * sizeof(wchar_t));

int s = 0, d = 0;
bool toomuchbyte = true; //set true to skip error prefix.

while (s < size_s && d < size_d)
{
unsigned char c = src[s];
if ((c & 0x80) == 0) 
{
des[d++] += src[s++];

else if((c & 0xE0) == 0xC0)  ///< 110x-xxxx 10xx-xxxx
{
WCHAR &wideChar = des[d++];
wideChar  = (src[s + 0] & 0x3F) << 6;
wideChar |= (src[s + 1] & 0x3F);

s += 2;
}
else if((c & 0xF0) == 0xE0)  ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
{
WCHAR &wideChar = des[d++];

wideChar  = (src[s + 0] & 0x1F) << 12;
wideChar |= (src[s + 1] & 0x3F) << 6;
wideChar |= (src[s + 2] & 0x3F);

s += 3;

else if((c & 0xF8) == 0xF0)  ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 
{
WCHAR &wideChar = des[d++];

wideChar  = (src[s + 0] & 0x0F) << 18;
wideChar  = (src[s + 1] & 0x3F) << 12;
wideChar |= (src[s + 2] & 0x3F) << 6;
wideChar |= (src[s + 3] & 0x3F);

s += 4;

else 
{
WCHAR &wideChar = des[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 

wideChar  = (src[s + 0] & 0x07) << 24;
wideChar  = (src[s + 1] & 0x3F) << 18;
wideChar  = (src[s + 2] & 0x3F) << 12;
wideChar |= (src[s + 3] & 0x3F) << 6;
wideChar |= (src[s + 4] & 0x3F);

s += 5;
}
}

t = des;
delete[] des;
des = NULL;

return t;
}



int Uni2UTF( const wstring& strRes, char *utf8, int nMaxSize )
{
if (utf8 == NULL) {
return -1;
}
int len = 0;
int size_d = nMaxSize;


for (wstring::const_iterator it = strRes.begin(); it != strRes.end(); ++it)
{
wchar_t wchar = *it;
if (wchar < 0x80)
{  //
//length = 1;
utf8[len++] = (char)wchar;
}
else if(wchar < 0x800)
{
//length = 2;

if (len + 1 >= size_d)
return -1;

utf8[len++] = 0xc0 | ( wchar >> 6 );
utf8[len++] = 0x80 | ( wchar & 0x3f );
}
else if(wchar < 0x10000 )
{
//length = 3;
if (len + 2 >= size_d)
return -1;

utf8[len++] = 0xe0 | ( wchar >> 12 );
utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f );
utf8[len++] = 0x80 | ( wchar & 0x3f );
}
else if( wchar < 0x200000 ) 
{
//length = 4;
if (len + 3 >= size_d)
return -1;

utf8[len++] = 0xf0 | ( (int)wchar >> 18 );
utf8[len++] = 0x80 | ( (wchar >> 12) & 0x3f );
utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f );
utf8[len++] = 0x80 | ( wchar & 0x3f );
}

}


return len;
}

string s2utfs(const  string&  strSrc)
{
string  strRes;
wstring  wstrUni = s2ws(strSrc);

char*  chUTF8 = new char[wstrUni.length() * 3];
memset(chUTF8,0x00,wstrUni.length() * 3);
Uni2UTF(wstrUni,chUTF8, wstrUni.length() * 3);
strRes = chUTF8;
delete  []chUTF8;
return strRes;
}


string  utfs2s(const string& strutf)
{
wstring  wStrTmp;
UTF2Uni( strutf.c_str(),wStrTmp);
return ws2s(wStrTmp);
}



#6


除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

#7


转换经常要碰上的,还是学会的好。

#8


to chengze:

wstring UTF2Uni(const char* src, std::wstring &t)
{
        else if((c & 0xE0) == 0xC0)  ///< 110x-xxxx 10xx-xxxx
        {
            WCHAR &wideChar = des[d++];
            wideChar  = (src[s + 0] & 0x3F) << 6;
            wideChar |= (src[s + 1] & 0x3F);
            
            s += 2;
        }
}

这个里面的WCHAR &wideChar = des[d++];是啥意思啊

#9


WCHAR &wideChar = des[d++];这个是啥意思啊
大家帮帮小弟呀

#10


支持老邓!  我用他上面的函数,就实现了. 

#11


不对啊,
string str = "大家好";
string Result = s2utfs(str);
cout<<hex<<Result<<endl;
结果不是str UTF8编码后的数据啊

#12


unicode与utf8转换,已经测试过:
//转换后使用完毕要释放lpMultiByteStr
int wcharToUTF8(LPCWSTR lpWideCharStr,LPSTR & lpMultiByteStr,int & cchMultiByte)
{
//revert wchar string to utf8 string
cchMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,0,NULL,NULL);//获取转换成多字节字符串所需要的内存
lpMultiByteStr = new char[cchMultiByte + 1];
memset(lpMultiByteStr,0,cchMultiByte + 1);
WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,cchMultiByte,NULL,NULL);

return cchMultiByte;
}

//转换后使用完毕要释放lpWideCharStr
int UTF8Towchar(LPCSTR lpMultiByteStr,LPWSTR & lpWideCharStr,int & cchWideChar)
{
//revert utf8 string to wchar string
    cchWideChar = MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),NULL,0);
    lpWideCharStr = new WCHAR[cchWideChar + 1];
memset(lpWideCharStr,0,sizeof(WCHAR) * (cchWideChar + 1));
MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),lpWideCharStr,cchWideChar);

return cchWideChar;
}

#13


mark一下。

#14


引用 12 楼 forever_feng 的回复:
unicode与utf8转换,已经测试过:
 //转换后使用完毕要释放lpMultiByteStr
 int wcharToUTF8(LPCWSTR lpWideCharStr,LPSTR & lpMultiByteStr,int & cchMultiByte)
 {
  //revert wchar string to utf8 string
  cchMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,0,NULL,NULL);//获取转换成多字节字符串所需要的内存
  lpMultiByteStr = new char[cchMultiByte + 1];
  memset(lpMultiByteStr,0,cchMultiByte + 1);
  WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,cchMultiByte,NULL,NULL);

  return cchMultiByte;
 }

 //转换后使用完毕要释放lpWideCharStr
 int UTF8Towchar(LPCSTR lpMultiByteStr,LPWSTR & lpWideCharStr,int & cchWideChar)
 {
  //revert utf8 string to wchar string
     cchWideChar = MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),NULL,0);
     lpWideCharStr = new WCHAR[cchWideChar + 1];
  memset(lpWideCharStr,0,sizeof(WCHAR) * (cchWideChar + 1));
  MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),lpWideCharStr,cchWideChar);

  return cchWideChar;
 }


大哥,不对吧。
我要的是字符串(如:“大家好”)与UTF8编码的相互转换。
“大家好”=>经UTF8编码后为e5a4a7e5aeb6e5a5bd20,反之也一样 。

#15


引用 6 楼 jackyjkchen 的回复:
除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

能解释一下原因吗?

#16


引用 15 楼 liudanking 的回复:
引用 6 楼 jackyjkchen 的回复:
除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

能解释一下原因吗?


Windows本身使用UTF16是一个原因,UTF8编码中有额外空间损耗又是个原因;

UTF8的优势是不用维护两套编码,所以适合网络传送

#17


qp::StringW.
这些是什么东东.定义在哪?我可以写成wchar_t * 么?

#18


引用 16 楼 jackyjkchen 的回复:
引用 15 楼 liudanking 的回复:
引用 6 楼 jackyjkchen 的回复:
除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

能解释一下原因吗?

 Windows本身使用UTF16是一个原因,UTF8编码中有额外空间损耗又是个原因;


感觉说反了或者我理解错了?
网络传输用utf-8是因为编码的长度比utf-16小,更结省吧. 

#19


我也遇到这个问题,不知解决了吗?

#20


我在使用别的库的时候,那些库需要使用中文路径,但是中文路径必须是UTF8格式的

#21


正在测试,学习中,看看

#1


#2


不能转换呀

error C2440: 'type cast' : cannot convert from 'ATL::CString' to 'LPCSTR'

error C2664: 'MultiByteToWideChar' : cannot convert parameter 3 from 'ATL::CString' to 'LPCSTR'

error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [3]' to 'const wchar_t *'

#3


下列函数是我工程里用的。
先转换到Unicode,再到UTF-8,反之也一样。
qp::StringW Global::AnsiToUnicode(const char* buf)
{
    int len = ::MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
    if (len == 0) return L"";

    std::vector<wchar_t> unicode(len);
    ::MultiByteToWideChar(CP_ACP, 0, buf, -1, &unicode[0], len);

    return &unicode[0];
}

qp::StringA Global::UnicodeToAnsi(const wchar_t* buf)
{
    int len = ::WideCharToMultiByte(CP_ACP, 0, buf, -1, NULL, 0, NULL, NULL);
    if (len == 0) return "";

    std::vector<char> utf8(len);
    ::WideCharToMultiByte(CP_ACP, 0, buf, -1, &utf8[0], len, NULL, NULL);

    return &utf8[0];
}

qp::StringW Global::Utf8ToUnicode(const char* buf)
{
    int len = ::MultiByteToWideChar(CP_UTF8, 0, buf, -1, NULL, 0);
    if (len == 0) return L"";

    std::vector<wchar_t> unicode(len);
    ::MultiByteToWideChar(CP_UTF8, 0, buf, -1, &unicode[0], len);

    return &unicode[0];
}

qp::StringA Global::UnicodeToUtf8(const wchar_t* buf)
{
    int len = ::WideCharToMultiByte(CP_UTF8, 0, buf, -1, NULL, 0, NULL, NULL);
    if (len == 0) return "";

    std::vector<char> utf8(len);
    ::WideCharToMultiByte(CP_UTF8, 0, buf, -1, &utf8[0], len, NULL, NULL);

    return &utf8[0];
}

#4


Up老邓

#5


用我的吧 标准c++的、


#include "stdafx.h"
#include <string>
#include <clocale>
using namespace std;

#include "charsetCvt.h"
string ws2s(const wstring& ws)
{
string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
setlocale(LC_ALL, "chs"); 
const wchar_t* _Source = ws.c_str();
size_t _Dsize = 2 * ws.size() + 1;
char *_Dest = new char[_Dsize];
memset(_Dest,0,_Dsize);
wcstombs(_Dest,_Source,_Dsize);
string result = _Dest;
delete []_Dest;
setlocale(LC_ALL, curLocale.c_str());
return result;
}
 

wstring s2ws(const string& s)
{
setlocale(LC_ALL, "chs"); 
const char* _Source = s.c_str();
size_t _Dsize = s.size() + 1;
wchar_t *_Dest = new wchar_t[_Dsize];
wmemset(_Dest, 0, _Dsize);
int nret = mbstowcs(_Dest,_Source,_Dsize);
wstring result = _Dest;
delete []_Dest;
setlocale(LC_ALL, "C");
 
return result;

}


 
wstring UTF2Uni(const char* src, std::wstring &t)
{
if (src == NULL) 
{
return L"";
}

int size_s = strlen(src);
int size_d = size_s + 10;          //?

wchar_t *des = new wchar_t[size_d];
memset(des, 0, size_d * sizeof(wchar_t));

int s = 0, d = 0;
bool toomuchbyte = true; //set true to skip error prefix.

while (s < size_s && d < size_d)
{
unsigned char c = src[s];
if ((c & 0x80) == 0) 
{
des[d++] += src[s++];

else if((c & 0xE0) == 0xC0)  ///< 110x-xxxx 10xx-xxxx
{
WCHAR &wideChar = des[d++];
wideChar  = (src[s + 0] & 0x3F) << 6;
wideChar |= (src[s + 1] & 0x3F);

s += 2;
}
else if((c & 0xF0) == 0xE0)  ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
{
WCHAR &wideChar = des[d++];

wideChar  = (src[s + 0] & 0x1F) << 12;
wideChar |= (src[s + 1] & 0x3F) << 6;
wideChar |= (src[s + 2] & 0x3F);

s += 3;

else if((c & 0xF8) == 0xF0)  ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 
{
WCHAR &wideChar = des[d++];

wideChar  = (src[s + 0] & 0x0F) << 18;
wideChar  = (src[s + 1] & 0x3F) << 12;
wideChar |= (src[s + 2] & 0x3F) << 6;
wideChar |= (src[s + 3] & 0x3F);

s += 4;

else 
{
WCHAR &wideChar = des[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 

wideChar  = (src[s + 0] & 0x07) << 24;
wideChar  = (src[s + 1] & 0x3F) << 18;
wideChar  = (src[s + 2] & 0x3F) << 12;
wideChar |= (src[s + 3] & 0x3F) << 6;
wideChar |= (src[s + 4] & 0x3F);

s += 5;
}
}

t = des;
delete[] des;
des = NULL;

return t;
}



int Uni2UTF( const wstring& strRes, char *utf8, int nMaxSize )
{
if (utf8 == NULL) {
return -1;
}
int len = 0;
int size_d = nMaxSize;


for (wstring::const_iterator it = strRes.begin(); it != strRes.end(); ++it)
{
wchar_t wchar = *it;
if (wchar < 0x80)
{  //
//length = 1;
utf8[len++] = (char)wchar;
}
else if(wchar < 0x800)
{
//length = 2;

if (len + 1 >= size_d)
return -1;

utf8[len++] = 0xc0 | ( wchar >> 6 );
utf8[len++] = 0x80 | ( wchar & 0x3f );
}
else if(wchar < 0x10000 )
{
//length = 3;
if (len + 2 >= size_d)
return -1;

utf8[len++] = 0xe0 | ( wchar >> 12 );
utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f );
utf8[len++] = 0x80 | ( wchar & 0x3f );
}
else if( wchar < 0x200000 ) 
{
//length = 4;
if (len + 3 >= size_d)
return -1;

utf8[len++] = 0xf0 | ( (int)wchar >> 18 );
utf8[len++] = 0x80 | ( (wchar >> 12) & 0x3f );
utf8[len++] = 0x80 | ( (wchar >> 6) & 0x3f );
utf8[len++] = 0x80 | ( wchar & 0x3f );
}

}


return len;
}

string s2utfs(const  string&  strSrc)
{
string  strRes;
wstring  wstrUni = s2ws(strSrc);

char*  chUTF8 = new char[wstrUni.length() * 3];
memset(chUTF8,0x00,wstrUni.length() * 3);
Uni2UTF(wstrUni,chUTF8, wstrUni.length() * 3);
strRes = chUTF8;
delete  []chUTF8;
return strRes;
}


string  utfs2s(const string& strutf)
{
wstring  wStrTmp;
UTF2Uni( strutf.c_str(),wStrTmp);
return ws2s(wStrTmp);
}



#6


除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

#7


转换经常要碰上的,还是学会的好。

#8


to chengze:

wstring UTF2Uni(const char* src, std::wstring &t)
{
        else if((c & 0xE0) == 0xC0)  ///< 110x-xxxx 10xx-xxxx
        {
            WCHAR &wideChar = des[d++];
            wideChar  = (src[s + 0] & 0x3F) << 6;
            wideChar |= (src[s + 1] & 0x3F);
            
            s += 2;
        }
}

这个里面的WCHAR &wideChar = des[d++];是啥意思啊

#9


WCHAR &wideChar = des[d++];这个是啥意思啊
大家帮帮小弟呀

#10


支持老邓!  我用他上面的函数,就实现了. 

#11


不对啊,
string str = "大家好";
string Result = s2utfs(str);
cout<<hex<<Result<<endl;
结果不是str UTF8编码后的数据啊

#12


unicode与utf8转换,已经测试过:
//转换后使用完毕要释放lpMultiByteStr
int wcharToUTF8(LPCWSTR lpWideCharStr,LPSTR & lpMultiByteStr,int & cchMultiByte)
{
//revert wchar string to utf8 string
cchMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,0,NULL,NULL);//获取转换成多字节字符串所需要的内存
lpMultiByteStr = new char[cchMultiByte + 1];
memset(lpMultiByteStr,0,cchMultiByte + 1);
WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,cchMultiByte,NULL,NULL);

return cchMultiByte;
}

//转换后使用完毕要释放lpWideCharStr
int UTF8Towchar(LPCSTR lpMultiByteStr,LPWSTR & lpWideCharStr,int & cchWideChar)
{
//revert utf8 string to wchar string
    cchWideChar = MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),NULL,0);
    lpWideCharStr = new WCHAR[cchWideChar + 1];
memset(lpWideCharStr,0,sizeof(WCHAR) * (cchWideChar + 1));
MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),lpWideCharStr,cchWideChar);

return cchWideChar;
}

#13


mark一下。

#14


引用 12 楼 forever_feng 的回复:
unicode与utf8转换,已经测试过:
 //转换后使用完毕要释放lpMultiByteStr
 int wcharToUTF8(LPCWSTR lpWideCharStr,LPSTR & lpMultiByteStr,int & cchMultiByte)
 {
  //revert wchar string to utf8 string
  cchMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,0,NULL,NULL);//获取转换成多字节字符串所需要的内存
  lpMultiByteStr = new char[cchMultiByte + 1];
  memset(lpMultiByteStr,0,cchMultiByte + 1);
  WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,cchMultiByte,NULL,NULL);

  return cchMultiByte;
 }

 //转换后使用完毕要释放lpWideCharStr
 int UTF8Towchar(LPCSTR lpMultiByteStr,LPWSTR & lpWideCharStr,int & cchWideChar)
 {
  //revert utf8 string to wchar string
     cchWideChar = MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),NULL,0);
     lpWideCharStr = new WCHAR[cchWideChar + 1];
  memset(lpWideCharStr,0,sizeof(WCHAR) * (cchWideChar + 1));
  MultiByteToWideChar(CP_UTF8,0,lpMultiByteStr,strlen(lpMultiByteStr),lpWideCharStr,cchWideChar);

  return cchWideChar;
 }


大哥,不对吧。
我要的是字符串(如:“大家好”)与UTF8编码的相互转换。
“大家好”=>经UTF8编码后为e5a4a7e5aeb6e5a5bd20,反之也一样 。

#15


引用 6 楼 jackyjkchen 的回复:
除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

能解释一下原因吗?

#16


引用 15 楼 liudanking 的回复:
引用 6 楼 jackyjkchen 的回复:
除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

能解释一下原因吗?


Windows本身使用UTF16是一个原因,UTF8编码中有额外空间损耗又是个原因;

UTF8的优势是不用维护两套编码,所以适合网络传送

#17


qp::StringW.
这些是什么东东.定义在哪?我可以写成wchar_t * 么?

#18


引用 16 楼 jackyjkchen 的回复:
引用 15 楼 liudanking 的回复:
引用 6 楼 jackyjkchen 的回复:
除非是网络传送、XML之类的,否则不推荐在Windows中使用本地UTF8编码,尤其不推荐中文使用UTF8

能解释一下原因吗?

 Windows本身使用UTF16是一个原因,UTF8编码中有额外空间损耗又是个原因;


感觉说反了或者我理解错了?
网络传输用utf-8是因为编码的长度比utf-16小,更结省吧. 

#19


我也遇到这个问题,不知解决了吗?

#20


我在使用别的库的时候,那些库需要使用中文路径,但是中文路径必须是UTF8格式的

#21


正在测试,学习中,看看