1

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

仍然不确定如何将其放入文本框中,但事实证明我不需要这样做。

4

4 回答 4

2

我觉得这不会有帮助,但这是一个起点......我假设它不会“正常工作”,而且我认为您不想尝试使用古怪的代码页来解决可能或者可能无法得到你想要的。

如何仅使用 MultiByteToWideChar(CP_UTF8, ...) 将其转换为 utf16,然后调用这些函数的 W 版本(或为项目定义 UNICODE/_UNICODE)。

我知道这适用于 MessageBox,我无法想象文本框没有 unicode 支持。

如果您需要将输出恢复为 UTF8 - 只需使用 WideCharToMultiByte()。

于 2009-01-13T17:47:04.300 回答
0

看一眼:

widechartomultibyte更多一般信息

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

于 2009-01-13T17:37:05.287 回答
0

首先使用 API MultiByteToWideChar将 utf8 字符串转换为宽字符串,并将 CP_UTF8 传递给 codepage 参数。如果您的应用程序是使用定义的 _UNICODE 编译的,您现在可以将宽字符串传递给您的文本框。

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

于 2009-01-13T17:50:36.930 回答
0

你的应用是 Unicode。如果是,请回退到 Stefan 的回答:

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

我假设它不是那么简单:您的应用程序是 ANSI。首先,您需要将字符串转换为 UTF16,如上所示。然后有一个瓶颈:您的 UTF8 字符串是否包含当前系统代码页之外的字符(又名“非 Unicode 应用程序语言”)?如果不是,则使用将 UTF16 字符串转换为系统区域设置

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

(或使用 ATL/MFC 宏之一,例如W2A(MyUtf16String)

你就完成了。

否则该字符串无法转换为 ANSI,这意味着您将有一个......咳咳......很难在 ANSI 文本框或消息框中显示它。

正如乔指出的那样,您可以使用在消息框中显示文本

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

尾随的 W 表示 API 的 Unicode (UTF16) 版本。

但是,在文本框中显示字符串仍然很困难:您需要使用CreateWindowExW(). 如果文本框的父窗口(对话框,框架?)不是 Unicode 窗口,我认为这将不起作用。

于 2009-01-13T19:33:36.520 回答