如何在C中设置运行时字符集?

如何在Linux环境下用C编程语言设置运行时字符集?

例如,我想将其设置为iso8859-1,utf-8或ascii。

printf( "%c", '\xa3')作用始终相同 – 它将值为0xA3(= 163)的一个字节输出到标准输出流。

然后在屏幕上显示的内容取决于您的终端(例如,xterm或Linux控制台)如何响应查看写入值163的字节。 这是您的终端的字符设置问题,并且您的C程序没有直接影响它的方式。 您需要做的是允许C程序找出终端期望的字符集,然后生成与之匹配的输出。

简单程序通常可以假设它们的输入所在的字符集也是它们的输出预期所在的字符集,然后它们只是忽略字符集问题并简单地在输出中重现高位字节,就像它们出现在输入。 (Unicode的UTF-8编码是故意设计的,以使该策略在许多情况下起作用)。

但是,如果不是这种情况 – 例如,如果您的程序包含带有非英文字母的硬编码字符串 – 您需要使用区域设置function来确定您的程序应该生成哪个字符编码,然后确保去做。 像libiconv这样的图书馆通常可以相对轻松地帮助解决这个问题。

你需要更具体地了解你的意思。 在大多数情况下,C并没有真正的字符集; 它的字符串只是以空字分隔的字节串,并且不对它们进行编码或解码。

C标准库中有一些函数,而POSIX中依赖于当前的语言环境。 您可以使用set setlocale来设置当前的语言环境; 它默认为C语言环境,其中字符串被视为ASCII并根据字节值进行比较。

如果要转换字符集,请使用iconv ; 这将允许您将缓冲区从一种编码转换为另一种编码。 例如,如果您在内部以UTF-8表示文本,但想要在ISO-8859-1中打印出来,那么您就可以使用它。

编辑添加 :从另一个答案的评论,你问:

我将终端的预期字符集设置为“ISO 8859-1”,但是为什么当我调用函数setlocale( LC_CTYPE, NULL ); ,它仍然返回C ? 我认为它应该返回ISO 8859-1因为这是终端预期的字符集。

程序启动时,其语言环境始终为“C”。 如果要根据环境变量设置区域设置,则需要调用setlocale( LC_ALL, "")setlocal( LC_CTYPE, "") ; 也就是说,您需要传入一个空字符串,然后根据您的环境变量设置区域设置。

请参阅setlocale(3) ,它设置程序的当前区域设置。

标准C提供setlocale()函数来设置区域设置。 LC_CTYPE的值定义字符类型。 有关更精细的细节,请参阅POSIX的内容 。 要查找系统支持的语言环境,请运行

 locale -a