【问题标题】:Can't print out in both english and cyrillic in my C++ MFC application无法在我的 C++ MFC 应用程序中以英文和西里尔文打印出来
【发布时间】: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 的真正含义,尽管对 wprintfprintf 的调用都是错误的。他们期望一种特定的编码,但您没有提供一种在不同编码之间透明的类型。请改用CStringW
  • 如果您正确格式化了您的 unicode 字符串(所有 unicode 字符),无论您的系统的语言环境如何,您都应该得到正确的输出。此外,如果您在西里尔文代码页 (1251) 中正确格式化了您的 MBCS 字符串,无论是英文 (chars=128),您应该得到正确的输出,只要您的系统的默认对应页是西里尔文(设置“非 Unicode 程序的语言”选项 - 这不一定与 UI 语言相同)。但是,通过使用 MBCS 字符串,您不会得到西欧、东欧、希腊语、土耳其语等字符。

标签: c++ unicode mfc


【解决方案1】:

已通过将操作系统系统区域设置为保加利亚语来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多