在linux环境下,如何在C编程语言中设置运行时字符集?
例如,我想将其设置为 iso8859-1、utf-8 或 ascii。
所做printf( "%c", '\xa3')
的总是相同的——它将一个值为 0xA3 (= 163) 的字节输出到标准输出流。
然后在屏幕上显示的内容取决于您的终端(例如 xterm 或 Linux 控制台)对看到写入值为 163 的字节的反应。那是你终端的字符设置问题,你的C程序没有直接的方式可以影响它。您需要做的是让 C 程序找出终端期望的字符集,然后生成匹配的输出。
简单的程序通常可以假设他们的输入所在的字符集也是他们的输出预期所在的字符集,然后他们只是忽略字符集问题并简单地在其输出中重现高位字节,就像它们出现在输入。(Unicode 的 UTF-8 编码是特意设计的,以使这种策略在许多情况下都有效)。
但是,如果不是这种情况(例如,如果您的程序包含带有非英文字母的硬编码字符串),则需要使用语言环境函数来确定您的程序应该生成哪种字符编码,然后确保去做。像 libiconv 这样的库通常可以相对轻松地帮助解决这个问题。
您需要更具体地说明您的意思。在大多数情况下,C 并没有真正的字符集。它的字符串只是以 null 分隔的字节字符串,不做任何编码或解码。
C 标准库和 POSIX 中有一些函数依赖于当前的语言环境。您可以使用 usesetlocale
设置当前语言环境;它默认为 C 语言环境,其中字符串被视为 ASCII 并根据字节值进行比较。
如果要转换字符集,请使用iconv
; 这将允许您将缓冲区从一种编码转换为另一种编码。例如,如果您在内部以 UTF-8 表示您的文本,但想以 ISO-8859-1 打印出来,这就是您将使用的。
编辑添加:从对另一个答案的评论中,您问:
我将终端的预期字符集设置为“ISO 8859-1”,但是为什么当我调用该函数时
setlocale( LC_CTYPE, NULL );
,它仍然返回C
?我认为它应该返回ISO 8859-1
,因为这是终端的预期字符集。
当程序启动时,它的语言环境总是“C”。如果要根据环境变量设置语言环境,则需要调用setlocale( LC_ALL, "")
or setlocal( LC_CTYPE, "")
; 也就是说,您需要传入一个空字符串,然后将根据您的环境变量设置语言环境。
请参阅setlocale(3)
,它设置了程序的当前语言环境。
标准 C 提供了setlocale()
设置语言环境的功能。LC_CTYPE 的值定义字符类型。有关一些更详细的信息,另请参阅POSIX所说的内容。要找出系统支持的语言环境,请运行
locale -a