我正在使用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"""外,没有任何标准可以让您甚至知道可能的语言环境名称,这是除了用户询问之外不尝试设置语言环境的另一个原因。你去。

07-24 09:46
查看更多