C++字符編碼轉(zhuǎn)化代碼

字號(hào):

C++字符編碼轉(zhuǎn)化代碼,大家可以自己編譯下看看。
    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);
    //這函數(shù)與操作系統(tǒng)相關(guān),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);
    #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;
    }