我在理解Windows C程序控制台上打印的字符集时遇到了麻烦。我没有发现任何问题直接回答这个问题(如果应该有一个链接将不胜感激)。
当查看一些不同的字符集(UCS-2, ISO 8859-1, Unicode)时,我总是在字符'ü'之后找到字符'ý'。当我编写一个C程序在控制台上打印字符时,实际上字符"上标2"跟在"ü"后面(对不起,我不知道怎么写下标)。在visual studio调试环境中,'ý'仍然显示在'ü'之后。
因此,我的问题是:C使用什么字符集在控制台上编写?这些字符是一些扩展的iso-latin-1字符在编码为utf-8时的iso-latin-1版本。这可能有两个原因:
- 你在你的程序输出中使用utf-8(所以一个单独的utf字符,代码点在
u0080
…u002f
,打印为两个字符),您的终端不支持utf-8输出。 - 你已经从一个不支持unicode字符的utf-8编码的程序的utf-8键盘上读取了这些字符。因此,字符被读取为成对字符,并被处理,然后作为成对输出。
因此,我的问题是:C在控制台上使用什么字符集?
视情况而定。为了支持多字节字符,您需要在C中做几件事。我假设您没有做任何特别的事情,只是使用C的正常函数,通常假设您使用7位ASCII字符,并且区域设置为C
(这根本不是区域设置):
- 您需要设置输入/输出例程以支持某些区域设置(您正在使用的区域设置,它由一些环境变量设置),以便它们知道在哪个字符集中显示多字节序列。在main中,需要通过调用
setlocale(3)
来初始化区域设置。 - 您需要使用
wchar_t
版本的所有例程将使用类型wchar_t
(此类型支持超过256个字符的字符集,如Unicode)
你需要教育自己,从那一点开始,例如,strlen()
将不会是计算字符串长度的例程(因为它只是计算传递字符串的字节数-这是char
相关的,而不是wchar_t
相关的),所以你需要使用mblen(3)
代替(在函数原型时要非常小心,因为有些函数采用wchar_t *
字符串,而另一些则采用char *
字符串)。
查看手册页中的例程,如:scscoll(3)
,strcoll(3)
,strxfrm(3)
,wcsxfrm(3)
,wprintf(3)
,fwprintf(3)
,swprintf(3)
,vfwprintf(3)
,fwide(3)
,…
我编写了一个小版本的cal(1)
命令,并将其国际化以支持外国语言环境和完整的国际支持(包括使用宽字符)。您可以在这里查看完整的东西,使用一个程序以您为会话配置的语言显示其输出。
请参阅locale(1)
命令的手册页,以检查您为帐户配置的区域设置。