标准输出和标准错误的字符编码

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

目前我的类在Windows上工作,稍后我将添加对Mac和Linux的支持,如果您了解这些流编码,我将不胜感激。

所以我的问题是:stdout和stderr的默认编码是什么?我能否稍后更改该编码,如果可以,那么存储在其中的数据会发生什么变化?

谢谢。

2个回答

4

标准输出和错误输出使用"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/


那么您的意思是标准流使用当前系统语言环境?我认为根据您所说的,我的类应该检测当前系统使用的代码页,并根据此编写字符串数据。如果编码更改,流数据会发生什么? - Muhammad

0

你可以看一下这个SO回答(最受欢迎的回答)。

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

我在这方面不是专家,但我猜想我们可以假设在使用std::string时应该使用std::cout,而在使用std::wstring时应该使用std::wcout


你说得对,但是我没有使用string或wstring,我有自己的字符串类,每个类都有其内部表示方式,因此我不能使用cout或wcout来打印到标准输出流。 - Muhammad
我可能会漏掉一些东西,但是...标准的std::stringstd::wstring不涵盖所有可能的编码吗?您真的需要创建自己的字符串类吗? - ereOn
1
这不仅仅是编码的问题,还有很多原因促使我编写自己的字符串类。例如,在我的类中,我使用MMX进行复制和搜索,使用引用计数器在按值传递时不浪费内存(有时我需要),对字符串进行哈希编码等等。实际上,我即将完成ASCII、UTF8类,但现在我卡在了打印函数上。 - Muhammad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接