Question

Comment faire en sorte qu'un ancien programme MFC VC ++ 6.0 lise et affiche le format UTF8 dans une zone de texte ou une zone de message? De préférence sans interrompre la lecture et l’affichage du fichier qui y est actuellement écrit (assez substantiel).

J'ai lu une ligne dans CString strStr, puis utilisé ce code:

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

Je ne suis toujours pas sûr de la manière dont je l'obtiendrais dans une zone de texte, mais il s'avère que je n'ai pas besoin de le faire de toute façon.

Était-ce utile?

La solution

Je pense que cela ne sera pas utile, mais c'est un point de départ ... Je suppose que cela ne fonctionne pas "tout simplement", et je ne pense pas que vous souhaitiez essayer de vous tromper de code farfelu les pages qui peuvent ou non vous donner ce que vous voulez.

Pourquoi ne pas utiliser simplement MultiByteToWideChar (CP_UTF8, ...) pour le convertir en utf16, puis appeler les versions W de ces fonctions (ou définir UNICODE / _UNICODE pour le projet).

Je sais que cela fonctionnera pour MessageBox et je ne peux pas imaginer que la zone de texte ne soit pas prise en charge par Unicode.

Si vous devez récupérer la sortie au format UTF8, utilisez simplement WideCharToMultiByte ().

Autres conseils

jetez un oeil à:

widechartomultibyte et pour plus d'informations générales

lorsque / si vous rencontrez des problèmes, assurez-vous de poster votre code. Cela fait longtemps que je n’ai pas fait cela et je me souviens que c’était un peu délicat.

Convertissez d'abord la chaîne utf8 en chaîne large avec l'API MultiByteToWideChar , en transmettant CP_UTF8 pour le paramètre codepage. Si votre application est compilée avec _UNICODE défini, vous pouvez maintenant passer la chaîne large à votre zone de texte.

Si votre application est toutefois compilée en tant qu'application MBCS, vous devez reconvertir la chaîne large en MBCS avec WideCharToMultiByte , en transmettant CP_ACP en tant que paramètre page de code.

Votre application est-elle unicode? Si oui, retour à la réponse de Stefan:

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

Je suppose que ce n'est pas aussi simple: votre application est ANSI. Tout d’abord, vous devez convertir la chaîne en UTF16 comme indiqué ci-dessus. Il existe ensuite un goulot d’étranglement: votre chaîne UTF8 contient-elle des caractères autres que la page de codes système actuelle (ou "Langage pour les applications non Unicode")? Si ce n'est pas le cas, convertissez la chaîne UTF16 aux paramètres régionaux du système à l'aide de

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

(ou utilisez l'une des macros ATL / MFC, telle que W2A (MyUtf16String) )

et vous avez terminé.

Sinon, la chaîne ne peut pas être convertie en ANSI, ce qui signifie que vous aurez ... euh ... de la difficulté à l'afficher dans une zone de texte ou un message ANSI.

Comme Joe l’a fait remarquer, vous pouvez afficher le texte dans une boîte de message à l’aide de

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

Le point final W désigne la version Unicode (UTF16) de l'API.

Afficher la chaîne dans une zone de texte restera toutefois difficile: vous devez créer par programmation la zone de texte en tant que fenêtre Unicode à l'aide de CreateWindowExW () . Je crois que cela ne fonctionnera pas si la fenêtre parente de la zone de texte (boîte de dialogue, cadre?) N’est pas une fenêtre Unicode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top