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::string
和 std::wcout
时使用 std::cout
,无论何时使用 std::wstring.
【讨论】:
你是对的,但是我没有使用 string 或 wstring 我有自己的字符串类,每个类都有其内部表示,因此我不能使用 cout 或 wcout 打印到标准输出流. 我可能会遗漏一些东西,但是……标准的std::string
和std::wstring
是否涵盖了所有可能的编码?您真的需要创建自己的字符串类吗?
它不仅仅是关于编码,有太多的原因让我制作自己的字符串类,例如在我的类中我使用 mmx 进行复制和搜索,引用计数器在经过时不会浪费内存值(有时我需要),字符串和许多其他的哈希编码。实际上我即将完成 ASCII,UTF8 类,但现在我被困在打印功能上。以上是关于stdout 和 stderr 字符编码的主要内容,如果未能解决你的问题,请参考以下文章
bash:如何将字符串添加到 stderr 行并按确切顺序组合 stdout 和 stderr 并存储在 bash 中的一个变量中?