【问题标题】:UTF-8 From File to TextBox VC++ 6.0UTF-8 从文件到文本框 VC++ 6.0
【发布时间】:2010-10-01 04:39:34
【问题描述】:

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

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

【问题讨论】:

    标签: c++ mfc utf-8 visual-c++-6


    【解决方案1】:

    我觉得这不会有帮助,但这是一个起点...我假设它不会“正常工作”,而且我认为您不想尝试使用古怪的代码可能会或可能不会为您提供所需内容的页面。

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

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

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

    【讨论】:

    • 在文本框上调用 W 函数可能不起作用,如果您使用 CreateWindowA 创建它。你必须保持一致。
    【解决方案2】:

    看看:

    widechartomultibytefor more general info

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您的应用是 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 窗口。如果文本框(对话框、框架?)的父窗口不是 Unicode 窗口,我认为这将不起作用。

        【讨论】:

          猜你喜欢
          • 2021-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多