我正在使用setlocale(LC_ALL,“葡萄牙语”),所以我的程序可以从文本文件中读取像“joão”这样的brazillian葡萄牙口音世界并在屏幕上打印,并且它可以正常工作。但是当我尝试从键盘输入“joão”这样的单词并使用gets()或scanf()时,保存的字符串与输入不同。有什么建议吗?
答案 0 :(得分:0)
如果您期望终端输入,那么除了
以外的任何其他方式使用setlocale
很少是正确的
setlocale(LC_ALL, "");
这会将程序的区域设置设置为环境的区域设置。通常,交互式环境中的区域设置对应于终端的配置,因此它表示交互式用户的期望。更改程序的区域设置对终端[注1]没有影响,因此如果您更改它,则只是意味着程序的区域设置不再符合用户的期望。
setlocale
文件输入是正确的,如果你提供了一些机制来指定文件的环境[注2]。但是,在Unix中,用户指定的最简单方法是在命令行上:
LC_ALL=pt_BR.utf8 ./my_command the_portuguese_file.utf8
对于Windows,您可能希望提供不同的机制来将文件的区域设置传达给程序。但是,如果没有这样的声明,使用环境中配置的语言环境通常是正确的选项。
以上的一个例外是喜欢不知道语言环境的程序,可能希望将语言环境设置为"C"
(或"POSIX"
,但"C"
不需要与Posix兼容的setlocale
)。作为一种自我文档形式,这可能很有用,但是没有必要,因为根本不会调用setlocale
的程序将在"C"
语言环境中执行(在大多数操作系统上)
在大多数情况下,通过修改环境变量LC_ALL
的值来更改环境的区域设置也不会影响终端配置。实际上,终端甚至可能不是环境的一部分;例如,如果您有远程ssh / telnet会话或GUI等效。用户应首先根据他们的期望配置他们的终端,然后配置他们的环境以对应;他们希望他们运行的实用程序能够尊重环境设置。
除了字符串"C"
,"POSIX"
和""
之外,没有任何标准可以让您知道哪些可能的区域设置名称,这是另一个原因尝试设置区域设置,除非用户要求您。