windows下c++宽字符和多字符wchar_t *和char * 间的转换

来源:赵克立博客 分类: C/C++ 标签:C/C++乱码发布时间:2017-10-22 15:32:51最后更新:2017-11-15 11:25:18浏览:2384
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
温馨提示:
技术类文章有它的时效性,请留意文章更新时间以及软件的版本
更新时间:
2017-11-15 11:25:18

使用网页请求网页数据的时候遇到啦转码的问题,请求utf8页面数据中文显示的乱码, 出现乱码的原因是:HTTP在传输过程中是二值的,它并没有text或者是unicode的概念。HTTP使用7bit的ASCII码作为HTTP headers,但是内容是任意的二值数据,需要根据header中指定的编码方式来描述它(通常是Content-Type header).因此当你接收到原始的HTTP数据时,先将其保存到char[] buffer中,然后利用WinHttpQueryHearders()获取HTTP头,得到内容的Content-Type,这样你就知道数据到底是啥类型的了,是ASCII还是Unicode或者其他。一旦你知道了具体的编码方式,你就可以通过MultiByteToWideChar()将其转换成合适编码的字符,存入wchar_t[]中。

函数版本处理

std::wstring CharToWchar(const char* c, size_t m_encode = CP_ACP)  
{  
    std::wstring str;  
    int len = MultiByteToWideChar(m_encode, 0, c, strlen(c), NULL, 0);  
    wchar_t*    m_wchar = new wchar_t[len + 1];  
    MultiByteToWideChar(m_encode, 0, c, strlen(c), m_wchar, len);  
    m_wchar[len] = '\0';  
    str = m_wchar;  
    delete m_wchar;  
    return str;  
}  
  
std::string WcharToChar(const wchar_t* wp, size_t m_encode = CP_ACP)  
{  
    std::string str;  
    int len = WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), NULL, 0, NULL, NULL);  
    char    *m_char = new char[len + 1];  
    WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), m_char, len, NULL, NULL);  
    m_char[len] = '\0';  
    str = m_char;  
    delete m_char;  
    return str;  
}

代码转换

多字节转宽字节

char ch[]="adsfasdfasdfasdfsdaf";
DWORD dwNum = MultiByteToWideChar(CP_ACP, 0,ch, -1, NULL, 0);
wchar_t* pwText = new wchar_t[dwNum];
MultiByteToWideChar(CP_ACP, 0, ch, -1, pwText, dwNum);

宽字节转多字节

wchar_t pwText[]=_T("asdfasdfsadfsdf")
int nBytes = WideCharToMultiByte(CP_ACP, 0, pwText, wcslen(pwText), NULL, 0, NULL, NULL);
char* m_char = new char[nBytes + 1];
WideCharToMultiByte(CP_ACP, 0, pwText, -1, m_char, nBytes + 1, NULL, NULL);



微信号:kelicom QQ群:215861553 紧急求助须知
点击更换验证码
Win32/PHP/JS/Android/Python