回答
请参阅setlocale(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, "")
;也就是说,您需要传入一个空字符串,然后将根据您的环境变量设置区域设置。
标准C提供setlocale()
函数来设置语言环境。 LC_CTYPE的值定义了字符类型。有关更详细的信息,请参阅POSIX必须说的内容。 要了解您的系统支持的语言环境,运行
locale -a
如果我找不到要在'locale -a'列表中使用的字符集,我该怎么办? –
在这种情况下,您应该在系统上安装其他语言环境。 –
请注意,安装语言环境_description_本身并不会使终端窗口和其他程序在屏幕上显示文本知道如何处理字符编码。这些字体需要单独安装,并且必须告诉终端程序在启动时使用它们。 –
printf("%c", '\xa3')
做什么都是一样的 - 它输出一个带有值0xA3执行(= 163)的标准输出流的字节。
然后屏幕上显示的内容取决于您的终端(例如xterm或Linux控制台)如何对看到一个写入了值为163的字节做出反应。这是您的终端的字符设置的问题,您的C程序没有直接的方式影响它。你需要做的是允许C程序找出终端期望的字符集,然后生成与之匹配的输出。
简单的程序通常可以假设输入的字符集是其输出所需的字符集,然后他们只是忽略字符集问题,并简单地在其输出中重现高位字节因为他们出现在输入中。 (Unicode的UTF-8编码是故意设计的,使得这种策略在很多情况下都可以使用)。
但是,如果情况并非如此 - 例如,如果程序包含非英文字母的硬编码字符串 - 则需要使用区域设置函数来确定程序应生成哪种字符编码,以及那么一定要这样做。像libiconv这样的库通常可以相对轻松地帮助解决这个问题。
我将终端的预期字符集设置为“ISO 8859-1”,但为什么当我调用函数'setlocale(LC_CTYPE,NULL);'时,它仍然返回'C'?我认为它应该返回'ISO 8859-1',因为这是终端预期的字符集。 –
@UniMouS:'setlocale'不是心理上的 - 它不知道终端实际在做什么,只有你设置了终端正在执行的_claim_的环境变量。如果环境对流程应该使用的字符集保持沉默,则无法检测终端实际在做什么。 –
但是当我在终端输入'echo $ LC_CTYPE'时,输出是:'ISO88591'。 –
- 1. 如何在运行时设置字段
- 2. 如何在html中设置字符集?
- 3. 如何在mssql_connect中设置字符集?
- 4. 是在htaccess中设置字符集时需要设置php字符集吗?
- 5. C#在网页上设置字符集
- 6. 如何在运行时使用C#运行字符串公式?
- 7. 如何在C#中运行时设置类型TSomething?
- 8. C#如何保存运行时字体设置
- 9. 在dylib中设置字符集符号
- 10. 如何在运行时为Spring TCP集成设置port和connectionFactory
- 11. 在运行时切换App.Config设置C#
- 12. 运行时在C#中设置实体框架连接字符串
- 13. 如何设置text_selector在运行时
- 14. 如何在运行时设置Maven artifactId?
- 15. 如何设置在运行时
- 16. 如何在运行时设置xml:lang值?
- 17. 如何在运行时设置java.net.preferIPv4Stack = true?
- 18. ,如何在运行时设置类型?
- 19. C#如何在设计中设置字符串集合的默认值
- 20. 我如何设置默认字符集设置为空在PHP
- 21. 如何在命令行上设置JVM字符集?
- 22. 如何在运行时在QT中设置QTimeEdit中的时间?
- 23. 如何设置特定的字符集?
- 24. 如何设置默认的字符集?
- 25. 如何在运行时使用字符串访问变量集?
- 26. 字符串在c + +运行时错误
- 27. 如何用c#中设置的字符串列表运行powershell命令?
- 28. 如何更改QtCreator中的C++运行时库设置?
- 29. 在php中设置字符集
- 30. 如何在运行时将指针设置为空(C++)
你是说系统区域设置? – ruakh
@ruakh我不确定,我刚刚从书中读到,根据不同的运行时字符集,像'printf(“%c”,'\ xa3')这样的输出将会不同。 –
我相信你应该避免在你的程序中设置*(除非它是一些服务器程序);让用户可以自由设定全局。 –