2010-10-23 129 views
3

问候,字符编码问题

我正在开发在C + +项目,我想使用的字符,如á é õ┌ ─ ┐ │划出一道漂亮的情侣帧。我的疑问在于我的代码/项目设置应该改变,因为没有任何修改,控制台就会打印伪随机字符。

我知道上述字符是在字符集代码页437又名扩展ASCII中定义的,但是我应该知道的是什么?

经过一番研究,我收录了指令setlocale(LC_CTYPE, "");,现在我可以打印重音字符(àéõ),但不能打印边框。

此外,我是否应该使用charstringwcharwstring来使用这些字符?

感谢

+0

您的应用程序可能正在使用特定的本地。但终端使用什么本地/字符编码来显示字符? – 2010-10-23 22:50:45

回答

2

我认为这样做是使用WCHAR和wstring的的人物的最好方式 - 他们都是为了区域设置独立的字符串操作,并在Windows和UTF-被定义为UTF-16 32在Linux中。

请注意,您需要使用适当的功能,例如wprintf,而不是printf ...如果你正在使用iostream,我认为应该工作外的开箱即用的wstrings。

编辑:请注意,wchar_t是unicode(实际上,它通常是)不是必需的。如果wchar_t(因此wstring)是unicode,那么C99标准(因此很可能是C++标准)指出要定义__STDC_ISO_10646__

换句话说,如果定义了__STDC_ISO_10646__,那么wchar_t是unicode - 至于确切类型(UTF-16或UTF-32),可以使用sizeof(wchar_t)。

+0

在C++(基于C89,而不是C99)中,编码wchar_t和std :: wstring具有的是实现细节,尽管您在Windows/Linux中声明的是常见的情况。对于流IO,使用'std :: wcout','std :: wcin'等。 – sbi 2010-10-23 22:49:57

+0

我删除了'setlocale(LC_CTYPE,“”);'因为wchar和wstring是语言环境独立的。但是现在,编译器输出错误'转换为执行字符集:非法字节序列',其操作类似于'std :: wstring maintenance = L“Manutenção”;'发生了什么? – 2010-10-25 13:16:11

+0

@sbi:同样适用于C99,它依赖于实现 - 但是,正如我所说,如果wchar_t是__STDC_ISO_10646__,它就是Unicode的某种形式。 – 2010-10-25 17:11:19

0

要了解要使用的Unicode字符查找http://unicode.org/charts/并搜索“框绘制”。该集包括CP 437中的字符,但也包括其他许多字符。下一个问题是您的设备是否可以显示部分或全部。