2009-01-13 75 views
1

如何獲取舊的VC++ 6.0 MFC程序在TextBox或MessageBox中讀取和顯示UTF8?優選地,不破壞當前寫在其中的任何文件讀取和顯示(相當大)。UTF-8從文件到文本框VC++ 6.0

我讀了行成的CString的strstr,然後用這個代碼:

int nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,strStr,1024,0,0); 
wchar_t * pWCMessage = new wchar_t[ nLengthNeeded ]; 

MultiByteToWideChar(CP_UTF8,0,strStr,1024,pWCMessage,nLengthNeeded); 

nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,"Error Title",50,0,0); 
wchar_t * pWCTitle = new wchar_t[ nLengthNeeded ]; 
MultiByteToWideChar(CP_UTF8,0,"Error Title",50,pWCTitle,nLengthNeeded); 

MessageBoxW(NULL,pWCMessage,pWCTitle,MB_ICONINFORMATION); 

仍然不知道我怎麼會讓它變成一個文本框,但事實證明,我並不需要做的反正。

回答

2

我覺得這樣做不會有幫助,但這是一個起點......我假設它不會「正常工作」,而且我不認爲你想嘗試使用古怪代碼頁可能會或可能不會得到你想要的。

如何使用MultiByteToWideChar(CP_UTF8,...)將其轉換爲utf16,然後調用這些函數的W版本(或爲項目定義UNICODE/_UNICODE)。

我知道這將適用於MessageBox,我無法想象文本框沒有Unicode支持。

如果您需要將輸出回到UTF8 - 只需使用WideCharToMultiByte()。

+1

如果使用CreateWindowA創建W函數,則在Textbox上調用W函數可能不起作用。你必須保持一致。 – MSalters 2009-01-14 10:27:30

0

使用API​​ MultiByteToWideChar首先將utf8字符串轉換爲一個寬字符串,並將CP_UTF8傳遞給codepage參數。 如果您的應用程序是使用_UNICODE編譯的,那麼現在可以將寬字符串傳遞給您的文本框。

如果您的應用程序被編譯爲MBCS應用程序,則必須將寬字符串轉換回MBCS並使用012_,並將CP_ACP作爲代碼頁參數。

0

是你的應用程序的Unicode。如果是的話,回退到Stefan的回答:

MyDisplayableUtf16String =的MultiByteToWideChar(CP_UTF8,MyUtf8String,...)

我假設它不是那麼簡單:你的應用程序是ANSI。 首先,您需要將字符串轉換爲UTF16,如上所示。 然後就存在一個瓶頸:你的UTF8字符串是否包含當前系統代碼頁的字符(又名「非Unicode應用程序的語言」)? 如果沒有,UTF-16字符串轉換爲使用

MyGoodOldAnsiString = WideCharToMultiByte(CP_ACP,MyUtf16String,...) 

系統區域設置(或使用ATL/MFC宏之一,如W2A(MyUtf16String)

就大功告成了。

否則無法將字符串轉換爲ANSI,這意味着您將擁有一個...... ahem ......很難將其顯示在ANSI文本框或消息框中。

喬指出的那樣,你可以使用顯示

MessageBoxW(...,MyDisplayableUtf16String,...)

尾隨W表示的Unicode(UTF-16)版本的mesage框中的文本API。

雖然在文本框中顯示字符串仍然很困難:您需要編程使用CreateWindowExW()將文本框創建爲Unicode窗口。如果文本框(對話框,框架?)的父窗口不是Unicode窗口,我認爲這不會起作用。