我正在使用setlocale(LC_ALL,“ Portuguese”),所以我的程序可以从文本文件中读取巴西葡萄牙语的重音符号如“joão”,并将其打印在屏幕上,并且可以很好地实现此目的。但是,当我尝试从键盘输入一个单词“joão”并使用gets()或scanf()时,保存的字符串与输入有所不同。有什么建议吗?
最佳答案
如果您期望终端输入,那么除了使用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"
和""
外,没有任何标准可以让您甚至知道可能的语言环境名称,这是除了用户询问之外不尝试设置语言环境的另一个原因。你去。