2014-03-05 58 views
1

我從轉換中得到了非常奇怪的字符。任何想法爲什麼?我從外部設備獲取「數據」,我需要將它顯示到win32 GUI。它沒有問題,當我從char到TCHAR的轉換中獲取奇怪的字符

printf("%s\n",data); 
在控制檯模式

,但有麻煩時,我把它移植到win32的要求我轉換成TCHAR顯示。

CHAR data[256]; 
TCHAR data1[256]; 
MultiByteToWideChar(CP_ACP,MB_COMPOSITE,data,-1,data1,0); 

CreateWindow(TEXT("STATIC"), data1, WS_VISIBLE | WS_CHILD | 
        10, 50,300,300,hWnd, (HMENU) none, NULL, NULL); 

順便說一句,使用

hDLL=LoadLibrary("MyKad.dll"); 
在Win32

不能工作,所以我不得不用

hDLL=LoadLibrary(TEXT("MyKad.dll")); 

可我知道這是正確的?謝謝

+0

的Win32不需要'TCHAR'。你最好用寬弦。 – chris

+0

您的項目是UNICODE項目嗎? –

+0

@MichaelWalz,好吧。已經開始工作了。謝啦!! – user3374405

回答

2

您的代碼失敗的原因是您在最終參數MultiByteToWideChar中傳遞0。你可以通過長度,如果data1解決您的代碼:

MultiByteToWideChar(CP_ACP, MB_COMPOSITE, data, -1, data1, 256); 

還要注意的是,你應該在調用API函數時,可以檢查錯誤。如果你這樣做,你會發現MultiByteToWideChar失敗。

我用下面的函數將轉換爲UTF-16:

std::wstring MultiByteStringToWideString(const std::string& MultiByte, 
    const UINT CodePage) 
{ 
    std::wstring result; 
    int cchWideChar = MultiByteToWideChar(CodePage, 0, MultiByte.c_str(), -1, 
     NULL, 0); 
    if (cchWideChar > 0) 
    { 
     wchar_t* bufferW = new wchar_t[cchWideChar]; 
     if (MultiByteToWideChar(CodePage, 0, MultiByte.c_str(), -1, bufferW, 
      cchWideChar) != 0) 
     { 
      result = std::wstring(bufferW); 
     } 
     delete[] bufferW; 
    } 
    return result; 
} 

所以,你可以使用這個如下:

std::wstring windowName = MultiByteStringToWideString(data, CP_ACP); 
CreateWindow(L"STATIC", windowName.c_str(), ...);