如何让旧的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);
仍然不确定如何将其放入文本框中,但事实证明我无论如何都不需要这样做。
答案 0 :(得分:2)
我觉得这不会有帮助,但这是一个起点......我假设它不“只是工作”,我认为你不想试图搞砸古怪的代码可能会或可能不会得到你想要的页面。
如何使用MultiByteToWideChar(CP_UTF8,...)将其转换为utf16,然后调用这些函数的W版本(或为项目定义UNICODE / _UNICODE)。
我知道这对MessageBox有效,我无法想象文本框没有unicode支持。
如果您需要将输出恢复为UTF8 - 只需使用WideCharToMultiByte()。
答案 1 :(得分:0)
答案 2 :(得分:0)
首先将utf8字符串转换为API MultiByteToWideChar的宽字符串,并为代码页参数传递CP_UTF8。 如果您的应用程序是使用_UNICODE定义编译的,那么现在可以将宽字符串传递给您的文本框。
如果您的应用程序编译为MBCS应用程序,则必须使用WideCharToMultiByte将宽字符串转换回MBCS,并将CP_ACP作为代码页参数传递。
答案 3 :(得分:0)
您的应用是Unicode吗?如果是的话,请回到Stefan的回答:
MyDisplayableUtf16String = MultiByteToWideChar(CP_UTF8,MyUtf8String,...)
我认为它并不那么简单:你的应用程序是ANSI。 首先,您需要将字符串转换为UTF16,如上所示。 然后有一个瓶颈:你的UTF8字符串是否包含当前系统代码页(即“非Unicode应用程序的语言”)之外的字符? 如果没有,请使用
将UTF16字符串转换为系统区域设置MyGoodOldAnsiString = WideCharToMultiByte(CP_ACP,MyUtf16String,...)
(或使用其中一个ATL / MFC宏,例如W2A(MyUtf16String)
)
你已经完成了。
否则该字符串无法转换为ANSI,这意味着您将难以...尝试在ANSI文本框或消息框中显示它。...
正如Joe指出的那样,您可以使用
在消息框中显示文本MessageBoxW(...,MyDisplayableUtf16String,...)
尾随W表示API的Unicode(UTF16)版本。
在文本框中显示字符串仍然很困难:您需要使用CreateWindowExW()
以编程方式将文本框创建为Unicode窗口。如果文本框的父窗口(对话框,框架?)不是Unicode窗口,我认为这将不起作用。