【发布时间】:2020-08-13 21:15:09
【问题描述】:
我正在编写一个 MFC 应用程序。我需要使用 CString 类而不是其他东西。我已经完成了以下操作,因为这是我可以显示西里尔字母的唯一方法。没有我要么得到问号,要么什么都没有出现。
_setmode(_fileno(stdout), _O_U16TEXT);
所以这行得通:
CString strTestObj2("дададада");
wprintf(L"%s", strTestObj2);
但这不是:
CString strTestObj1("String1.");
printf("%s", strTestObj1);
它给出了运行时错误。我能做些什么来解决它?
【问题讨论】:
-
你应该在任何地方使用宽字符串,即
L"дадада",而不是混入字符函数,例如printf -
如果你想再次使用
printf,你必须把模式改回来。致电_setmode(_fileno(stdout), _O_TEXT);或使用CStringW strTestObj2(L"дададада English");和wprintf -
CString不是一个类。它是类模板实例化的 typedef。由于我们不知道您的项目配置,我们无法看到CString的真正含义,尽管对wprintf和printf的调用都是错误的。他们期望一种特定的编码,但您没有提供一种在不同编码之间透明的类型。请改用CStringW。 -
如果您正确格式化了您的 unicode 字符串(所有 unicode 字符),无论您的系统的语言环境如何,您都应该得到正确的输出。此外,如果您在西里尔文代码页 (1251) 中正确格式化了您的 MBCS 字符串,无论是英文 (chars=128),您应该得到正确的输出,只要您的系统的默认对应页是西里尔文(设置“非 Unicode 程序的语言”选项 - 这不一定与 UI 语言相同)。但是,通过使用 MBCS 字符串,您不会得到西欧、东欧、希腊语、土耳其语等字符。