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

时间:2012-11-08 00:23:59

标签: c linux character-encoding

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

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

4 个答案:

答案 0 :(得分:3)

你需要更具体地说明你的意思。在大多数情况下,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 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

locale -a