ZC: 来自 我的项目 czgj
ZC: (1)、经过测试 MultiByteToWideChar(...) 返回的是 (需要的)WideChar[宽字符]的个数;(2)、WideCharToMultiByte 返回的是 (需要的)Char[窄字符]的个数 。
1、代码:
#include "TzEncodingWindows.h" #ifdef BUILD_IN_WIN32 #include <QDebug> #include <windows.h> #include <wchar.h> #include <string> #include <iostream> using namespace std; #endif// BUILD_IN_WIN32 TzEncodingWindows::TzEncodingWindows() { } TzEncodingWindows::~TzEncodingWindows() { } #ifdef BUILD_IN_WIN32 //* // ZC: 下面的代码来自网络:// http://www.cnblogs.com/lidabo/p/3903620.html // ZC: Ansi-->Unicode std::wstring MBytesToWString(const char* lpcszString) { //int len = strlen(lpcszString); int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, lpcszString, -1, NULL, 0); wchar_t* pUnicode = new wchar_t[unicodeLen + 1]; memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t)); ::MultiByteToWideChar(CP_ACP, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen); wstring wString = (wchar_t*)pUnicode; delete [] pUnicode; return wString; } // ZC: Unicode-->Ansi std::string WStringToMBytes(const wchar_t* lpwcszWString) { char* pElementText; int iTextLen; // wide char to multi char iTextLen = ::WideCharToMultiByte(CP_ACP, 0, lpwcszWString, -1, NULL, 0, NULL, NULL); pElementText = new char[iTextLen + 1]; memset((void*)pElementText, 0, (iTextLen + 1) * sizeof(char)); ::WideCharToMultiByte(CP_ACP, 0, lpwcszWString, 0, pElementText, iTextLen, NULL, NULL); std::string strReturn(pElementText); delete [] pElementText; return strReturn; } // ZC: Utf8-->Unicode std::wstring UTF8ToWString(const char* lpcszString) { //int len = strlen(lpcszString); int unicodeLen = ::MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, NULL, 0); wchar_t* pUnicode; pUnicode = new wchar_t[unicodeLen + 1]; memset((void*)pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t)); ::MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen); wstring wstrReturn(pUnicode); delete [] pUnicode; return wstrReturn; } // ZC: Unicode-->Utf8 std::string WStringToUTF8(const wchar_t* lpwcszWString) { char* pElementText; int iTextLen = ::WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)lpwcszWString, -1, NULL, 0, NULL, NULL); pElementText = new char[iTextLen + 1]; memset((void*)pElementText, 0, (iTextLen + 1) * sizeof(char)); ::WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)lpwcszWString, -1, pElementText, iTextLen, NULL, NULL); std::string strReturn(pElementText); delete [] pElementText; return strReturn; } //*/ void TzEncodingWindows::Test_Ansi2Utf8() { qDebug() << "Hello : "+QString::number(sizeof(char)); //* char* lpcszString = "50路"; //::MessageBoxA(0, lpcszString, "MessageBoxA - 1", 0); QString str = QString::fromUtf8(lpcszString); qDebug() << "lpcszString : "+QString::fromUtf8(lpcszString); qDebug() << "str.length() : "+ QString::number(str.length()); QByteArray byteArr = str.toUtf8(); qDebug() << "byteArr.length() : "+QString::number(byteArr.length()); for (int i=0; i<byteArr.length(); i++) { qDebug() << QString::number(i)+" : "+QString::number((int)byteArr.at(i), 16); } qDebug() << "strlen(lpcszString) : "+QString::number(strlen(lpcszString)); int unicodeLen = ::MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, NULL, 0); qDebug() << "unicodeLen : "+QString::number(unicodeLen); wchar_t* pUnicode; pUnicode = new wchar_t[unicodeLen + 1]; memset((void*)pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t)); ::MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen); //::MessageBoxW(0, pUnicode, L"MessageBoxW", 0); wchar_t* lpwcszWString = pUnicode; ::MessageBoxW(0, lpwcszWString, L"MessageBoxW", 0); int iTextLen = ::WideCharToMultiByte(CP_ACP, 0, lpwcszWString, -1, NULL, 0, NULL, NULL); qDebug() << "iTextLen : "+QString::number(iTextLen); char* pElementText = new char[iTextLen + 1]; memset((void*)pElementText, 0, (iTextLen + 1) * sizeof(char)); int iRtn = ::WideCharToMultiByte( CP_ACP, 0, lpwcszWString, unicodeLen,//0, // ZC: 网页中的这个值,设置的不正确,导致函数返回0,且GetLastError为ERROR_INVALID_PARAMETER。Fuck !!! pElementText, iTextLen, NULL, NULL); // ERROR_INVALID_PARAMETER --> 87 qDebug() << "WideCharToMultiByte return : "+QString::number(iRtn)+" -> GetLastError : "+QString::number(::GetLastError()); ::MessageBoxA(0, pElementText, "MessageBoxA", 0); for (int i=0; i<iTextLen; i++) { qDebug() << QString::number(i)+" --> "+QString::number((int)pElementText[i], 16); } std::string strReturn(pElementText); qDebug() << "strReturn : " + QString::fromStdString(strReturn); // delete [] pUnicode; // delete [] pElementText; //*/ } #endif// BUILD_IN_WIN32
2、