2010-05-18 105 views
2

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

现在我的课程在Windows中工作,后来我会添加对mac和linux的支持,所以如果你知道关于这些流编码的任何事情,我将不胜感激。

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

谢谢。

回答

3

输出和错误使用“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”和“”支持。

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

+0

所以你的意思是标准流使用当前的系统区域设置?我认为取决于你说我的类应该检测系统使用的当前代码页,并取决于它写入字符串数据。 如果编码改变,流数据会发生什么? – 2010-05-18 14:16:03

0

你可以看看this SO answer(最多投票的答案)。

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

我不是专家在这里,但我想我们可以假设,只要您使用std::stringstd::wcout只要您使用std::wstring.

+0

你是对的但是我不使用字符串或wstring的,我自己的字符串类,每一个都有它的内部表示为此,我不能使用的cout或wcout打印到标准输出流。 – 2010-05-18 13:00:32

+0

我可能会错过一些东西,但是...不要标准的'std :: string'和'std :: wstring'覆盖所有可能的编码?你真的*需要创建自己的字符串类吗? – ereOn 2010-05-18 13:04:50

+1

它不只是关于编码,有太多的理由让我做我自己的字符串类,例如在我的课上,我使用mmx进行复制和搜索,引用计数器在传递值时不浪费内存(有时我需要),字符串和其他许多字符的散列编码。 实际上我即将完成从ASCII,UTF8类,但现在我卡在打印功能。 – 2010-05-18 13:43:43