Domanda

Come posso ottenere un vecchio programma MFC VC ++ 6.0 per leggere e visualizzare UTF8 in TextBox o MessageBox? Preferibilmente senza interrompere nessuno dei file che leggono e visualizzano attualmente scritti (abbastanza sostanziali).

Ho letto una riga in CString strStr, quindi ho usato questo codice:

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);

Ancora non sono sicuro di come lo inserirei in una casella di testo, ma risulta che non devo farlo comunque.

È stato utile?

Soluzione

Sento che questo non sarà utile, ma è un punto di partenza ... Suppongo che non "funzioni" e non penso che tu voglia provare a rovinare il codice con un codice stravagante pagine che potrebbero offrirti o meno ciò che desideri.

Che ne dici di usare MultiByteToWideChar (CP_UTF8, ...) per convertirlo in utf16 e quindi chiamare le versioni W di quelle funzioni (o definire UNICODE / _UNICODE per il progetto).

So che funzionerà per MessageBox e non riesco a immaginare che la casella di testo non abbia il supporto Unicode.

Se è necessario ripristinare l'output su UTF8, utilizzare WideCharToMultiByte ().

Altri suggerimenti

dai un'occhiata a:

widechartomultibyte e per informazioni più generali

quando / se si verificano problemi, assicurarsi di pubblicare il codice. È passato un po 'di tempo da quando l'ho fatto e ricordo che è stato un po' complicato.

Converti prima la stringa utf8 in una stringa larga con l'API MultiByteToWideChar , passando CP_UTF8 per il parametro codepage. Se la tua applicazione è compilata con _UNICODE definito, ora puoi passare la stringa larga alla tua casella di testo.

Se l'applicazione viene comunque compilata come applicazione MBCS, è necessario riconvertire la stringa estesa in MBCS con WideCharToMultiByte , passando CP_ACP come parametro codepage.

L'app è Unicode. Se sì, fallback alla risposta di Stefan:

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

Presumo che non sia così semplice: la tua app è ANSI. Prima di tutto, devi convertire la stringa in UTF16 come mostrato sopra. Quindi c'è un collo di bottiglia: la tua stringa UTF8 contiene caratteri al di fuori dell'attuale tabella di codici di sistema (aka "Lingua per applicazioni non Unicode")? In caso contrario, converti la stringa UTF16 nella locale del sistema usando

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

(o usa una delle macro ATL / MFC, come W2A (MyUtf16String) )

e il gioco è fatto.

Altrimenti la stringa non può essere convertita in ANSI, il che significa che avrai un ... ahem ... difficoltà a provare a visualizzarla in una casella di testo ANSI o in una finestra di messaggio.

Come ha sottolineato Joe, è possibile visualizzare il testo in una finestra di messaggio usando

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

La W finale indica la versione Unicode (UTF16) dell'API.

La visualizzazione della stringa in una casella di testo rimarrà comunque difficile: dovresti creare a livello di programmazione la casella di testo come finestra Unicode usando CreateWindowExW () . Il che credo non funzionerà se la finestra principale della casella di testo (finestra di dialogo, cornice?) Non è una finestra Unicode.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top