windows下c++宽字符和多字符wchar_t *和char * 间的转换
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。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);