题
如何让旧的 VC++ 6.0 MFC 程序在 TextBox 或 MessageBox 中读取和显示 UTF8?最好不要破坏当前写入其中的任何文件读取和显示(相当大)。
我将一行读入 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);
仍然不确定如何将其放入文本框中,但事实证明我无论如何都不需要这样做。
解决方案
我觉得这不会是有帮助的,但它是一个起点......我猜想它不“只是工作”,我不认为你想尝试耍着古怪代码网页可能或你想要的可能不会得到你。
如何只使用的MultiByteToWideChar(CP_UTF8,...),将其转换为UTF-16,然后调用这些函数在W版本(或定义为项目UNICODE / _UNICODE)。
我知道这会为MessageBox的工作,我无法想象在文本框中没有Unicode支持。
如果你需要得到的输出回UTF8 - 只需使用调用WideCharToMultiByte()
其他提示
是您的应用程序的Unicode。如果是的话,回退到Stefan的回答:
MyDisplayableUtf16String =的MultiByteToWideChar(CP_UTF8,MyUtf8String,...)
我假设它不是那么简单:你的应用程序是ANSI。 首先,您需要将字符串转换为UTF-16,如上图所示。 然后有一个瓶颈:你的UTF8字符串包含ouside当前系统的代码页(又名“语言的非Unicode应用程序”)字符? 如果不是,使用UTF16字符串转换为系统区域
MyGoodOldAnsiString = WideCharToMultiByte(CP_ACP,MyUtf16String,...)
(或使用ATL之一/ MFC宏,如W2A(MyUtf16String)
)
,你就大功告成了。
否则该字符串不能被转换为ANSI,这意味着你将有一个......咳...硬时间,试图在一个ANSI文本或消息框中显示它。
如乔指出的那样,则可以使用显示在mesage框中的文本
MessageBoxW(...,MyDisplayableUtf16String,...)
尾随W表示API的Unicode(UTF-16)版本。
显示在一个文本框的字符串仍将难以不过:你需要programmaticaly创建文本框为Unicode窗口使用CreateWindowExW()
。我相信如果文本框(对话框,框架?)的父窗口不是一个Unicode窗口将无法正常工作。