gpt4 book ai didi

c++ - 使用多字节字符集的 MFC 应用程序中的 UTF-8 文本

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:41 25 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序接收以 UTF-8 编码的文本并需要在某些 MFC 控件上显示它。该应用程序是使用多字节字符集 (MBCS) 构建的,我们假设这无法更改。

我希望如果我将从 UTF-8 接收的文本转换为宽字符字符串,我将能够使用 SetWindowTextW 方法正确显示它。为了尝试这个,我使用了一个玩具应用程序,它从一个文件中读取输入并设置我的控件的文本。

std::wstring utf8_decode(const std::string &str)
{
if (str.empty()) return std::wstring();
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}

BOOL CAboutDlg::OnInitDialog()
{
std::vector<std::string> texts;
texts.resize(6);
std::fstream f("D:\\code\\sample-utf8.txt", std::ios::in);
for (size_t i=0;i<6;++i)
std::getline(f, texts[i]);

::SetWindowTextW(GetDlgItem(IDC_BUTTON1)->m_hWnd, utf8_decode(texts[0]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON2)->m_hWnd, utf8_decode(texts[1]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON3)->m_hWnd, utf8_decode(texts[2]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON4)->m_hWnd, utf8_decode(texts[3]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON5)->m_hWnd, utf8_decode(texts[4]).c_str());
::SetWindowTextW(GetDlgItem(IDC_BUTTON6)->m_hWnd, utf8_decode(texts[5]).c_str());
return TRUE;
}

使用 MBCS 构建玩具应用后,我没有得到我想要的东西。 enter image description here

只要我使用 unicode 构建应用程序,它就可以正常工作 enter image description here

这是否意味着当我使用 MBCS 构建时,没有希望为单个控件使用 unicode 文本?如果可能的话,你能给我一些指示吗?谢谢。

最佳答案

MBCS 应用创建 MBCS 窗口,一般来说,即使您使用宽字符串界面,这些窗口也只能显示来自单个代码页的文本。

对于 MBCS 应用程序,SetWindowTextW 的宽字符串版本实质上是使用用户的当前区域设置(具有默认代码页)将宽字符串转换为 MBCS,然后将其传递给函数的 -A 版本。

正如您在“Unicode”实验中看到的那样,总体上您的做法是正确的,但由于该应用程序是 MBCS 这一事实而受到限制。

关于c++ - 使用多字节字符集的 MFC 应用程序中的 UTF-8 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54484799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com