如何让旧的 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()

其他提示

看一眼:

宽图多字节了解更多一般信息

当/如果您遇到麻烦时,请确保发布您的代码。我已经有一段时间没有这样做了,我记得这有点棘手。

首先使用API​​将utf8字符串转换为宽字符串 多字节到宽字符, ,传递 CP_UTF8 作为代码页参数。如果您的应用程序是使用定义的 _UNICODE 进行编译的,那么您现在可以将宽字符串传递到文本框。

但是,如果您的应用程序被编译为 MBCS 应用程序,则必须使用以下命令将宽字符串转换回 MBCS 宽字符到多字节, ,将 CP_ACP 作为代码页参数传递。

是您的应用程序的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窗口将无法正常工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top