2012-11-08 35 views
0

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

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

+0

你是说系统区域设置? – ruakh

+0

@ruakh我不确定,我刚刚从书中读到,根据不同的运行时字符集,像'printf(“%c”,'\ xa3')这样的输出将会不同。 –

+0

我相信你应该避免在你的程序中设置*(除非它是一些服务器程序);让用户可以自由设定全局。 –

回答

1

请参阅setlocale(3),它设置程序的当前语言环境。

2

你需要对你的意思更具体些。在大多数情况下,C并没有真正的字符集;它的字符串只是空字符串的字节,并没有做任何事情来编码或解码它们。

C标准库和POSIX中有几个函数依赖于当前的语言环境。您可以使用使用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, "");也就是说,您需要传入一个空字符串,然后将根据您的环境变量设置区域设置。

1

标准C提供setlocale()函数来设置语言环境。 LC_CTYPE的值定义了字符类型。有关更详细的信息,请参阅POSIX必须说的内容。 要了解您的系统支持的语言环境,运行

locale -a 
+0

如果我找不到要在'locale -a'列表中使用的字符集,我该怎么办? –

+0

在这种情况下,您应该在系统上安装其他语言环境。 –

+0

请注意,安装语言环境_description_本身并不会使终端窗口和其他程序在屏幕上显示文本知道如何处理字符编码。这些字体需要单独安装,并且必须告诉终端程序在启动时使用它们。 –

2

printf("%c", '\xa3')做什么都是一样的 - 它输出一个带有值0xA3执行(= 163)的标准输出流的字节

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

简单的程序通常可以假设输入的字符集是其输出所需的字符集,然后他们只是忽略字符集问题,并简单地在其输出中重现高位字节因为他们出现在输入中。 (Unicode的UTF-8编码是故意设计的,使得这种策略在很多情况下都可以使用)。

但是,如果情况并非如此 - 例如,如果程序包含非英文字母的硬编码字符串 - 则需要使用区域设置函数来确定程序应生成哪种字符编码,以及那么一定要这样做。像libiconv这样的库通常可以相对轻松地帮助解决这个问题。

+0

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

+0

@UniMouS:'setlocale'不是心理上的 - 它不知道终端实际在做什么,只有你设置了终端正在执行的_claim_的环境变量。如果环境对流程应该使用的字符集保持沉默,则无法检测终端实际在做什么。 –

+0

但是当我在终端输入'echo $ LC_CTYPE'时,输出是:'ISO88591'。 –

相关问题