Seltlocale(LC_ALL,“葡萄牙语”)无法读取键盘输入的重音。 C

时间:2016-04-18 14:34:40

标签: c

我正在使用setlocale(LC_ALL,“葡萄牙语”),所以我的程序可以从文本文件中读取像“joão”这样的brazillian葡萄牙口音世界并在屏幕上打印,并且它可以正常工作。但是当我尝试从键盘输入“joão”这样的单词并使用gets()或scanf()时,保存的字符串与输入不同。有什么建议吗?

1 个答案:

答案 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"语言环境中执行(在大多数操作系统上)

注释

  1. 在大多数情况下,通过修改环境变量LC_ALL的值来更改环境的区域设置也不会影响终端配置。实际上,终端甚至可能不是环境的一部分;例如,如果您有远程ssh / telnet会话或GUI等效。用户应首先根据他们的期望配置他们的终端,然后配置他们的环境以对应;他们希望他们运行的实用程序能够尊重环境设置。

  2. 除了字符串"C""POSIX"""之外,没有任何标准可以让您知道哪些可能的区域设置名称,这是另一个原因尝试设置区域设置,除非用户要求您。