stdout和stderr字符编码
我工作在一个C++字符串库,它具有处理ASCII,UTF8,UTF16,UTF32字符串的主要4类,每个类都有打印函数,用于格式化输入字符串并将结果输出到stdout或stderr 。我的问题是我不知道什么是这些流的默认字符编码。stdout和stderr字符编码
现在我的课程在Windows中工作,后来我会添加对mac和linux的支持,所以如果你知道关于这些流编码的任何事情,我将不胜感激。
所以我的问题是:stdout和stderr的默认编码是什么,我可以稍后更改该编码,如果是的话,那么存储在那里的数据会发生什么?
谢谢。
输出和错误使用“C”区域,那么你应该使用std::cout
。 “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”和“”支持。
你可以看看this SO answer(最多投票的答案)。
这不完全是你的问题,但它肯定是相关的,并提供了很多有用的信息。
我不是专家在这里,但我想我们可以假设,只要您使用std::string
和std::wcout
只要您使用std::wstring.
你是对的但是我不使用字符串或wstring的,我自己的字符串类,每一个都有它的内部表示为此,我不能使用的cout或wcout打印到标准输出流。 – 2010-05-18 13:00:32
我可能会错过一些东西,但是...不要标准的'std :: string'和'std :: wstring'覆盖所有可能的编码?你真的*需要创建自己的字符串类吗? – ereOn 2010-05-18 13:04:50
它不只是关于编码,有太多的理由让我做我自己的字符串类,例如在我的课上,我使用mmx进行复制和搜索,引用计数器在传递值时不浪费内存(有时我需要),字符串和其他许多字符的散列编码。 实际上我即将完成从ASCII,UTF8类,但现在我卡在打印功能。 – 2010-05-18 13:43:43
所以你的意思是标准流使用当前的系统区域设置?我认为取决于你说我的类应该检测系统使用的当前代码页,并取决于它写入字符串数据。 如果编码改变,流数据会发生什么? – 2010-05-18 14:16:03