【发布时间】:2018-03-09 11:08:23
【问题描述】:
我是 C++ 和 MFC 的新手。主要问题是我有一个需要翻译成俄语的 MFC 项目。我看到最好的选择是将项目更改为 Unicode,但我不能,因为这是一个巨大的项目,当我更改时,我收到超过 4000 个错误。稍后我们会将所有代码传递给 Unicode,但现在我只需要在按钮和 CListBox 上显示 Cyrillic。
嗯,主要是:如何用 Multibyte 打印 Cyrillic?
谢谢大家!
PD:抱歉,我会更明确地说明我的尝试:
使用俄语语言环境:
setlocale(LC_ALL, "russian_russia.1251");
setlocale(LC_CTYPE, "rus");
但是没有用。显示问号。
我还尝试使用函数 WideCharToMultiByte 进行转换。但显示的字符似乎编码错误。
std::string utf8_encode(const std::wstring &wstr)
{
if (wstr.empty()) return std::string();
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
return strTo;
}
wchar_t* wch = L"Привет";
std::string ch = utf8_encode(wch);
m_wndOutputBuild.AddString(ch.c_str()); //OUTPUT Привет
PD2:现在我这样打电话
setlocale(LC_ALL, "russian_russia.1251");
std::wstring wch = L"Привет";
std::string ch = encode_1251(wch);
m_wndOutputBuild.AddString(ch.c_str()); //OUTPUT Ïðèâåò
和功能:
std::string encode_1251(const std::wstring &wstr)
{
if (wstr.empty()) return std::string();
int size_needed = WideCharToMultiByte(1251, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);
WideCharToMultiByte(1251, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
return strTo;
}
我发现 Windows-1251 将 CP 放在 WideCharToMultiByte here 上。
【问题讨论】:
-
我知道,stackoverflow.com/questions/48558810/… 这对我不起作用,因为我无法更改为 Unicode,我的项目是一个巨大的项目。我也尝试使用语言环境,但没有做任何改变。显示问号。
-
@Treith:我是在previous answer 中建议您迁移到Unicode 的人,我仍然认为这是最好的方法。无论如何,如果您和您的团队确实想保留您的代码库 MBCS(“多字节”),我建议您从一个简单的基于 MFC 对话框的应用程序开始,然后在其中插入一个编辑控件和一个列表框.从编辑控件读取用户输入,并将用户输入的行添加到列表框中。使用
CEdit::GetWindowText从编辑控件读取用户输入,使用CListBox::AddString填充LB。 ... -
... 您应该会在列表框中看到用户输入的完全相同的字符串。如果你不这样做,那么在这里发布你的代码和确切的结果。从简单开始,并尝试找出您的确切问题。我不是 MBCS/Cyrillic 方面的专家,所以我无法提供更好的帮助。
-
嗨@Mr.C64,这不是我的帖子。只有一个示例解决方案在我的情况下不起作用。但是谢谢,我将从这个开始。
-
@Treith:我注意到您在问题中添加了更多详细信息和 C++ 代码 sn-p,因此我根据这些新信息添加了答案。
标签: c++ mfc cyrillic multibyte