如何在 Windows 上正确地将拉丁字符打印到 C++ 控制台?

2023-11-26

我在用 C++ 将法语字符写入控制台时遇到问题。该字符串是从文件中加载的std::ifstream and std::getline然后使用打印到控制台std::cout。以下是该字符串在文件中的内容:

该链对应于代码“TEST_CODE”,并且与语言环境“fr”对应。

这是字符串的打印方式:

该命令对应于代码“TEST_CODE”,并且与语言环境“fr”对应。

我该如何解决这个问题?


问题在于控制台使用与系统其他部分不同的代码页。例如,通常为美洲和西欧设置的 Windows 系统使用 CP1252,但这些地区的控制台使用 CP437 或 CP850。

您可以设置控制台输出代码页以匹配您正在使用的编码,也可以转换字符串以匹配控制台的输出代码页。

设置控制台输出代码页:

SetConsoleOutputCP(GetACP()); // GetACP() returns the system codepage.
std::cout << "La chaîne qui correspond au code \"TEST_CODE\" n'a pas été trouvée à l'aide locale \"fr\".";

或者在编码之间进行转换的多种方法之一(此方法需要 VS2010 或更高版本):

#include <codecvt> // for wstring_convert
#include <locale>  // for codecvt_byname
#include <iostream>

int main() {
    typedef std::codecvt_byname<wchar_t,char,std::mbstate_t> codecvt;

    // the following relies on non-standard behavior, codecvt destructors are supposed to be protected and unusable here, but VC++ doesn't complain.
    std::wstring_convert<codecvt> cp1252(new codecvt(".1252"));
    std::wstring_convert<codecvt> cp850(new codecvt(".850"));

    std::cout << cp850.to_bytes(cp1252.from_bytes("...été trouvée à...\n")).c_str();
}

后一个示例假设您实际上需要在 1252 和 850 之间进行转换。您可能应该使用函数 GetOEMCP() 来找出实际的目标代码页,并且源代码页实际上取决于您用于源代码的内容而不是运行该程序的机器上 GetACP() 的结果。

另请注意,该程序依赖于标准无法保证的东西:wchar_t 编码在语言环境之间共享。在大多数平台上都是如此——通常所有语言环境中的 wchar_t 都使用某种 Unicode 编码——但并非全部。


理想情况下,您可以在任何地方使用 UTF-8,并且以下内容可以正常工作,就像现在在其他平台上一样:

#include <iostream>

int main() {
    std::cout << "La chaîne qui correspond au code \"TEST_CODE\" n'a pas été trouvée à l'aide locale \"fr\".\n";
}

不幸的是,Windows 无法以这种方式支持 UTF-8,除非放弃 UTF-16 作为 wchar_t 编码并采用 4 字节 wchar_t,或者违反标准要求并破坏符合标准的程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 上正确地将拉丁字符打印到 C++ 控制台? 的相关文章

随机推荐

  • 如何使用运行时参数在 Scala 中创建单例对象

    我正在尝试使用运行时指定的参数创建一个单例对象 例子 object NetworkPusher val networkAdress 想象一下 networkAdress 参数来自命令行 我该如何制定解决方法来做到这一点 单例是延迟初始化的
  • 使用 Hibernate 处理文本文件

    我在用休眠在 Java 应用程序中访问我的数据库 它与 MS SQL 和 MySQL 配合得很好 但是我必须在某些表单上显示的一些数据必须来自文本文件 我所说的文本文件是指人类可读的文件 它们可以是 CSV 制表符分隔 甚至是每行的键 值对
  • 如何让顶级git跟踪另一个子目录git下的所有文件

    命令序列 mkdir 顶目录mkdir another git directory触摸文件C触摸屏Dgit 添加 git commit m 子目录初始化 cd 触摸文件触摸文件Bgit 添加 git commit m 顶层目录初始化 git
  • Spring事务不回滚

    我们遇到了 Spring 事务回滚问题 回滚似乎不起作用 在我的服务层方法中 注释为 Transactional我叫三个不同的DAOImpl类插入3条记录 中间插入从第四个表中获取数据以填充描述字段 但这失败了 我预计第一个插入会回滚 但似
  • 使用 pip 将 Python 包安装到不同的目录中?

    我知道明显的答案是使用 virtualenv 和 virtualenvwrapper 但由于各种原因我不能 不想这样做 那么如何修改命令 pip install package name to make pip将软件包安装在默认位置以外的位
  • 如何解决 wsdl2java 上 ObjectFactory 中的冲突?

    我在用着CXF and wsdl2java自动生成Web服务类 问题 不知何故 我想要连接的网络服务的某些元素有重复的名称 Two declarations cause a collision in the ObjectFactory cl
  • 获取 java.time.chrono.HijrahDate 实例的月份名称

    HijrahDate hd HijrahChronology INSTANCE date LocalDate of 2014 11 25 如果我们有HijrahDate实例 预计有一个方法UmalquraCalendar API显示月份名称
  • 我可以将 Must_use 应用于函数结果吗?

    我有一个函数返回一个f64 我想确保使用该函数的输出 而不是仅仅忽略它 有什么办法可以做到这一点吗 返回类型不用于错误处理 因此将其包装在Result or Option确实没有意义 我想要类似的东西 must use fn calcula
  • 两个 .net 程序集之间的循环引用

    我有两个程序集 A 和 B A 已存在对 B 的引用 并且必须保持这种状态 现在我对B做了一些修改 需要引用A 所以就出现了循环引用 一些细节 A 有一些属性网格 B 中的对话框需要托管这些属性网格 因此 为了避免这种循环引用问题 我尝试在
  • 交换字符串中的字母

    我需要按照以下规则交换字符串中的字母 A 被 T 取代 T 被替换为 A C 被 G 取代 G 被 C 取代 例如 ACGTA应该成为TGCAT 解决这个问题的最佳方法是什么 正在寻找java A to T T to A 找到了这个建议 S
  • 如何调试/记录 wsgi python 应用程序?

    我试过这个 usr bin python from wsgiref simple server import make server from cgi import parse qs escape import logging import
  • 为什么 object.__new__ 在这两种情况下工作方式不同?

    Python 版本 2 7 3 默认 2013 年 4 月 10 日 06 20 15 n GCC 4 6 3 我有这个 gt gt gt class testclass1 object pass gt gt gt class testcl
  • WPF:ContentPresenter 上的 TextTrimming

    有没有一种简单的方法可以让 TextTrimming 与 ContentPresenter 一起使用 我有 TextBlock 和 AccessText 的隐式样式 其中 TextTrimming 设置为 CharacterEllipsis
  • 具有特征的 Scala 和 Mockito

    我有一个简单的类 它自然地分为两部分 所以我重构为 class Refactored extends PartOne with PartTwo 然后单元测试开始失败 下面是重现该问题的尝试 所有三个示例的功能都是相同的 但第三个测试失败并出
  • 指向结构的指针的大小[重复]

    这个问题在这里已经有答案了 我试图记住 C 编程的基础知识 并且关于结构体指针 我正在执行以下操作 include
  • Google Apps 脚本国际化 (i18n)

    这些文档似乎没有提及任何内容 是否有关于如何在 Google Apps 脚本中执行 i18n 的推荐方法 尤其是作为 WebApp 发布的 有没有办法找出用户的区域设置 Session getActiveUserLocale 应返回区域设置
  • CodeIgniter POST/GET 默认值

    如果 POST GET 数据为空 假 我可以设置默认值吗 this gt input gt post varname value if falsy 所以我不必像这样编码 a this gt input gt post varname thi
  • 非 void 函数中的空返回是未定义的行为吗?

    阅读有关该主题的答案后控制到达非 void 函数的末尾我没有看到任何专门针对以空退出非 void 函数的情况的答案return陈述 int return integer return empty return in non void fun
  • 我想通过蓝牙设备强制打开键盘

    我有一个蓝牙条形码设备 如果将蓝牙设备连接到 iPhone 我无法使用 iPhone 键盘写任何内容 您已经知道iPhone键盘不会显示 因为蓝牙设备已识别键盘 但 当 iPhone 连接蓝牙设备时 我必须通过键盘在文本框中写入一些内容 请
  • 如何在 Windows 上正确地将拉丁字符打印到 C++ 控制台?

    我在用 C 将法语字符写入控制台时遇到问题 该字符串是从文件中加载的std ifstream and std getline然后使用打印到控制台std cout 以下是该字符串在文件中的内容 该链对应于代码 TEST CODE 并且与语言环