ReadString在UNICODE下中文亂碼的解決辦法(Char型字符和Unicode字符的轉換問題)

CStdioFile file;
    if (!file.Open(m_File_Path, CFile::modeRead)) return;
    CString strLine;

    while (file.ReadString(strLine))    
    { 
       //strLine處理
    }

問題:
    CStdioFile在_MSBC環境下讀取任何ANSI文本數據都沒問題,在UNICODE環境下讀取ANSI文本中的中文時就會顯示亂碼。

原因:
    CStdioFile讀取ANSI文本數據時按char類型讀取,在_MSBC下可以直接填充到CString,在UNICODE環境下要先將char轉換成寬字符WCHAR,然後再填充到CString,即一個漢字的兩個char將變成兩個UNICODE字符WCHAR。

解決辦法:
    在UNICODE環境下file.ReadString(strLine)取得的數據實際上是char類型,但是存儲在UNICODE字符串中。爲了取得真實數據,必須對strLine進行處理。

void function(CString &str)
{
    char *szBuf = new char[str.GetLength()];

    for (int i = 0 ; i < str.GetLength(); i++)
    {
        szBuf[i] = str.GetAt(i);
    }
    CharToUnicode(szBuf , &str);

    delete []szBuf;
}
    注:此函數在編譯的時候會提示
                warning C4244: '=' : conversion from 'unsigned short' to 'char', possible loss of data
            不用管它,丟失的數據是我們不需要的。


===================================================================================

/////////////////////////////////////////////////////////////////////////////////////////
// 將Char型字符轉換爲Unicode字符
int CharToUnicode(char *pchIn, CString *pstrOut)
{
    int nLen;
    WCHAR *ptch;

    if(pchIn == NULL)
    {
        return 0;
    }

    nLen = MultiByteToWideChar(CP_ACP, 0, pchIn, -1, NULL, 0);
    ptch = new WCHAR[nLen];
    MultiByteToWideChar(CP_ACP, 0, pchIn, -1, ptch, nLen);
    pstrOut->Format(_T("%s"), ptch);
    
    delete [] ptch;

    return nLen;
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 將Unicode字符轉換爲Char型字符
int UnicodeToChar(CString &strIn, char *pchOut, int nCharLen)
{
    if(pchOut == NULL)
    {
        return 0;
    }

    int nLen = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)strIn.GetBuffer(BUFFER_SIZE_KILO),-1, NULL, 0, NULL, NULL);
    nLen = min(nLen, nCharLen);
    WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)strIn.GetBuffer(BUFFER_SIZE_KILO), -1, pchOut,
        nLen, NULL, NULL);
    
    if(nLen < nCharLen)
    {
        pchOut[nLen] = 0;
    }

    return nLen;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章