2009-03-02 83 views
0

我有這樣的功能:使用WideCharToMultiByte轉換LPCWSTR。需要幫助

BOOL WINAPI MyFunction(HDC hdc, LPCWSTR text, UINT cbCount){ 

char AnsiBuffer[255]; 
int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 0, NULL, NULL); 
if(written > -1) AnsiBuffer[written] = '\0'; 

if(written>0){ 

    ofstream myfile; 
    myfile.open ("C:\\example.txt", ios::app); 
    myfile.write(AnsiBuffer, sizeof(AnsiBuffer)); 
    myfile.write("\n", 1); 
    myfile.close(); 

} 


.... 

當我顯示與MessageBoxW()輸入文本LPCWSTR,文本顯示了罰款。當我嘗試將其轉換爲多字節時,返回值看起來很正常(例如:22,45等),但結果是一些廢話(「從中國電子出版社出版)。建議?

+0

注意,您可以使用wofstream寫的Unicode(寬)字符串的文件。 http://msdn.microsoft.com/en-us/library/f1d6b0fk(VS.80).aspx – Andy 2009-03-02 02:13:32

回答

2

我看到兩個問題;

1)您將'0'傳遞給WideCharToMultiByte以獲取多字節緩衝區的大小。如果您閱讀文檔,則會返回所需的字節數,但不會執行實際轉換。 (這是爲了讓您隨後分配正確大小的緩衝區並調用該功能)。 2)in file.write sizeof(AnsiBuffer)將導致寫入255個字節,而不管緩衝區中的內容如何。 sizeof是一個編譯時計算,它返回一個變量的大小。你應該用代表字符串長度的'書面'變量替換它。

1

您需要將緩衝區的長度傳遞給API,而不是傳遞0。當您通過0時,該函數將返回所需的緩衝區長度,但不會寫入該緩衝區。您會看到未初始化數組的結果。

這裏是正確的判罰,用在正確的地方:

int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 255, NULL, NULL);