Windows控制台上的C字符编码

d4so4syb  于 2022-12-24  发布在  Windows
关注(0)|答案(1)|浏览(135)

我在理解Windows C程序中控制台上打印的字符集时遇到了麻烦。我没有找到任何直接回答这个问题的问题(如果有一个链接将不胜感激)。
在查看一些不同的字符集时(UCS-2,ISO 8859 - 1,Unicode)我总是在字符"ü"后面找到字符"ý"。当我编写一个C程序在控制台上打印字符时,实际上字符"superscript 2"跟在"ü"后面。(对不起,不知道如何在这里写字符下标).在Visual Studio调试环境中,"ý"仍然显示为跟在"ü'后面.
因此,我的问题是:C在控制台上使用什么字符集?

4xrmg8kj

4xrmg8kj1#

当编码为utf-8时,这些字符是某些扩展iso-latin-1字符的iso-latin-1版本。这可能是由于两个原因:

  • 你正在你的程序输出中使用utf-8(因此一个代码点在\u0080 ... \u002f范围内的utf字符被打印为两个字符)并且你的终端不支持utf-8输出。
  • 你已经从一个不支持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 *字符串)。
检查手册页中的例程,如:一米12纳米一x,一米13纳米一x,一米14纳米一x,一米15纳米一x,一米16纳米一x,一米17纳米一x,一米18纳米一x,一米19纳米一x,一米20纳米一x,...
我写了一个小版本的cal(1)命令,并国际化它,以支持外国语言环境和完整的国际支持(这包括使用宽字符)您可以得到它here查看完整的东西,使用一个程序,显示其输出的语言,您已经为您的会话配置.
另请参见locale(1)命令的手册页,以检查您为帐户配置的语言环境。

相关问题