stdout 和 stderr 字符编码

Posted

技术标签:

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

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

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

所以我的问题是: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 类,但现在我被困在打印功能上。

以上是关于stdout 和 stderr 字符编码的主要内容,如果未能解决你的问题,请参考以下文章

bash:如何将字符串添加到 stderr 行并按确切顺序组合 stdout 和 stderr 并存储在 bash 中的一个变量中?

Python监控子进程的stderr和stdout

6.4 QTextStream处理文件数据流

Python 中如何设置 stdout 的编码?

python:运行一个超时的进程并捕获stdout、stderr和退出状态[重复]

python重定向sys.stdinsys.stdout和sys.stderr