c++后台向网页传数据中文乱码
unicode的char字符串直接转UTF-8的char
网上找到有unicode转utf-8的代码,但是参数用的是wchar_t的. 不能直接用稍微改造一下
WideCharToMultiByte()函数需要Windows.h头文件
//原本的代码
//unicode转UTF-8
char* UnicodeToUtf8(wchar_t* pwszUnicode)
{
int len;
len = WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);
char* szUtf8 = (char*)malloc((int)len + 1);
memset(szUtf8, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, szUtf8, len, NULL, NULL);
return szUtf8;
}
直接换成参数char*的
//unicode转UTF-8
char* UnicodeToUtf8(char* str)
{
// 1. char转wchar_t
wchar_t* pwszUnicode;
int iSize;
iSize = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
pwszUnicode = (wchar_t*)malloc(iSize * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, str, -1, pwszUnicode, iSize);
// 2. wchar_t转u8char
int len;
len = WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);
char* szUtf8 = (char*)malloc((int)len + 1);
memset(szUtf8, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, pwszUnicode, -1, szUtf8, len, NULL, NULL);
return szUtf8;
}
这样就行了
wchar_t 和 char 之间转换
C++中 Unicode 与 UTF-8 编码互转
// 宽字符转UTF8 ,处理字符乱码
std::string EncodeUtf8(std::wstring in)
{
std::string s(in.length() * 3 + 1, ' ');
size_t len = ::WideCharToMultiByte(CP_UTF8, 0,
in.c_str(), in.length(),
&s[0], s.length(),
NULL, NULL);
s.resize(len);
return s;
}
// UTF8转宽字符
std::wstring DecodeUtf8(string in)
{
wstring s(in.length(), (' ')); //"tchar.h"
size_t len = ::MultiByteToWideChar(CP_UTF8, 0,
in.c_str(), in.length(),
&s[0], s.length());
s.resize(len);
return s;
}
//wstring转string
std::string ws2s(const std::wstring& ws)
{
std::string curLocale = setlocale(LC_ALL, NULL); //"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);
std::string result = _Dest;
delete[]_Dest;
setlocale(LC_ALL, curLocale.c_str());
return result;
}
//string转wstring
std::wstring s2ws(const std::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);
mbstowcs(_Dest, _Source, _Dsize);
std::wstring result = _Dest;
delete[]_Dest;
setlocale(LC_ALL, "C");
return result;
}
//多字节字符项目(ansi)显示网页传来的数据(utf-8)
void Utf8ToAnsi(const char* lpcszStr, char* lpwszStr)
{
DWORD dwMinSize;
WCHAR* strTmp;
dwMinSize = MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, NULL, 0);
strTmp = new WCHAR[dwMinSize];
MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, strTmp, dwMinSize);
int targetLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, (char*)lpwszStr, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, (char*)lpwszStr, targetLen, NULL, NULL);
}
//这么写不太好使 改一下
std::string Utf8ToAnsi(const char* lpcszStr)
{
DWORD dwMinSize;
WCHAR* strTmp;
dwMinSize = MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, NULL, 0);
strTmp = new WCHAR[dwMinSize];
MultiByteToWideChar(CP_UTF8, 0, lpcszStr, -1, strTmp, dwMinSize);
const int size = sizeof(lpcszStr);
//std::cout << "sizeof " << sizeof(lpcszStr) << std::endl;
//std::cout << "strlen " << strlen(lpcszStr) << std::endl;
char lpwszStr[size];
int targetLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, lpwszStr, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)strTmp, -1, lpwszStr, targetLen, NULL, NULL);
return lpwszStr;
}
可以了