windows控制台上的C字符编码



我在理解Windows C程序控制台上打印的字符集时遇到了麻烦。我没有发现任何问题直接回答这个问题(如果应该有一个链接将不胜感激)。

当查看一些不同的字符集(UCS-2, ISO 8859-1, Unicode)时,我总是在字符'ü'之后找到字符'ý'。当我编写一个C程序在控制台上打印字符时,实际上字符"上标2"跟在"ü"后面(对不起,我不知道怎么写下标)。在visual studio调试环境中,'ý'仍然显示在'ü'之后。

因此,我的问题是:C使用什么字符集在控制台上编写?

这些字符是一些扩展的iso-latin-1字符在编码为utf-8时的iso-latin-1版本。这可能有两个原因:

  • 你在你的程序输出中使用utf-8(所以一个单独的utf字符,代码点在u0080u002f,打印为两个字符),您的终端不支持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)命令的手册页,以检查您为帐户配置的区域设置。