【问题标题】:stdout and stderr character encodingstdout 和 stderr 字符编码
【发布时间】:2010-05-18 12:23:10
【问题描述】:

我正在开发一个 c++ 字符串库,该库具有处理 ASCII、UTF8、UTF16、UTF32 字符串的主要 4 个类,每个类都有 Print 函数,用于格式化输入字符串并将结果打印到 stdout 或 stderr。我的问题是我不知道这些流的默认字符编码是什么。

目前我的课程在 Windows 上工作,稍后我将添加对 mac 和 linux 的支持,所以如果您对这些流编码有所了解,我将不胜感激。

所以我的问题是:stdout 和 stderr 的默认编码是什么,我可以稍后更改该编码吗?如果可以,存储在那里的数据会怎样?

谢谢。

【问题讨论】:

    标签: c++ string unicode stdout stderr


    【解决方案1】:

    stdout 和 stderr 使用“C”语言环境。 “C”语言环境是自然的,在大多数系统中翻译成当前用户的语言环境。您可以使用setlocale 函数强制程序使用特定的语言环境:

    // Set all categories and return "English_USA.1252"
    setlocale( LC_ALL, "English" );
    // Set only the LC_MONETARY category and return "French_France.1252"
    setlocale( LC_MONETARY, "French" );
    setlocale( LC_ALL, NULL );
    

    支持的语言环境字符串是系统和编译器特定的。只需要支持“C”和“”。

    http://www.cplusplus.com/reference/clibrary/clocale/

    【讨论】:

    • 所以您的意思是标准流使用当前系统语言环境?我认为根据您所说的,我的类应该检测系统使用的当前代码页,并取决于它写入字符串数据。如果编码发生变化,流数据会发生什么变化?
    【解决方案2】:

    您可以查看this SO answer(最受好评的答案)。

    这不完全是你的问题,但它肯定是相关的并且提供了很多有用的信息。

    我不是这方面的专家,但我想我们可以假设您应该在使用 std::stringstd::wcout 时使用 std::cout,无论何时使用 std::wstring.

    【讨论】:

    • 你是对的,但是我没有使用 string 或 wstring 我有自己的字符串类,每个类都有其内部表示,因此我不能使用 cout 或 wcout 打印到标准输出流.
    • 我可能会遗漏一些东西,但是……标准的std::stringstd::wstring 是否涵盖了所有可能的编码?您真的需要创建自己的字符串类吗?
    • 它不仅仅是关于编码,有太多的原因让我制作自己的字符串类,例如在我的类中我使用 mmx 进行复制和搜索,引用计数器在经过时不会浪费内存值(有时我需要),字符串和许多其他的哈希编码。实际上我即将完成 ASCII,UTF8 类,但现在我被困在打印功能上。
    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2011-07-22
    • 2011-04-18
    • 1970-01-01
    • 2019-04-23
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多