bool GB2312_AnsiToUnicode(char *lpszOut, const char* lpszIn, const char* lpszCurCode/* = NULL*/, const char* lpszOutCode/* = NULL*/) { #ifdef WIN32 // _WIN32 //Do nothing int lpszOut_size=GB2312_AnsiToUnicode_Size(lpszIn);
//这函数与操作系统相关,XP下用CP_THREAD_ACP,win2000下用CP_ACP MultiByteToWideChar(CP_THREAD_ACP, 0,lpszIn,strlen(lpszIn)+1,(unsigned short*)lpszOut,lpszOut_size);
#else // _WIN32 #ifdef HAVE_ICONV /* Use iconv to convert the message into utf-16. * \"char\" and \"\" are aliases for the local 8-bit encoding */ iconv_t cd; // ICONV_CONST char *from_str = message; char *from_str = (char*)lpszIn; char *to_str = lpszOut; size_t from_sz = strlen(lpszIn) + 1; // size_t to_sz = from_sz*4; size_t to_sz = GB2312_AnsiToUnicode_Size(lpszIn); size_t res; int i; char lpszCodeName_From[30], lpszCodeName_To[30]; if (lpszCurCode) strcpy(lpszCodeName_From, lpszCurCode); else strcpy(lpszCodeName_From, \"gb2312\"); if (lpszOutCode) strcpy(lpszCodeName_To, lpszOutCode); else strcpy(lpszCodeName_To, \"UTF-16\"); #ifdef _DEBUG fprintf(stdout, \"Convert ’%s’ from %s to %s\\n\", lpszIn, lpszCodeName_From, lpszCodeName_To); [Page] #endif // if ((cd = iconv_open(\"unicode\", \"gb2312\")) == (iconv_t)-1) { if ((cd = iconv_open(lpszCodeName_To, lpszCodeName_From)) == (iconv_t)-1) { perror(\"Couldn’t open iconv\"); return false; } res = iconv(cd, &from_str, &from_sz, &to_str, &to_sz); if (res == -1) { perror(\"Couldn’t use iconv\"); return false; } iconv_close(cd); #endif #ifdef _DEBUG fprintf(stdout, \"Convert result: ’%s’\\n\", lpszOut); #endif #endif // End of _WIN32 return true; } int GB2312_AnsiToUnicode_Size(const char* lpszIn) { int iCounter = 0; for (int index = 0; lpszIn[index]; index++) { if( (unsigned char)lpszIn[index] > 127 ) { index++; } else { ; } iCounter+=2; } iCounter += 4; #ifdef _DEBUG fprintf(stdout, \"GB2312_AnsiToUnicode_Size() return %d\\n\", iCounter); #endif return iCounter; // return 48; } |