【问题标题】:Seltlocale(LC_ALL,"Portuguese") cant read accents from keyboard input. CSetlocale(LC_ALL,"Portuguese") 无法从键盘输入中读取重音符号。 C
【发布时间】:2016-04-18 14:34:40
【问题描述】:

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

【问题讨论】:

  • 语言环境不会直接影响您可以输入的内容。您可能希望输出为 UTF-8(或至少让终端和语言环境同意),但对于输入,它在很大程度上取决于输入层。无论如何,我不认为"Portuguese" 是一个有效的语言环境;试试pt_BR.UTF-8
  • 您使用哪个源字符集和哪个环境字符集?哪种编码?您的终端使用哪个?您使用哪些功能进行输入/输出?等
  • @tripleee 感谢您的帮助。这适用于键盘输入问题,但无法读取文本文件中的文字。
  • 无法访问文件或对其内容的充分描述,也无法读取无法读取的代码,我认为我们无法在此处添加任何内容。如果您需要详细的帮助,请使用相关的详细信息更新您的问题。回答@Olaf 的问题将是一个好的开始,但可能还不够。
  • @Olaf 我不确定如何回答所有这些问题,抱歉我缺乏知识。我只能说文本文件根据notepad++编码是ASCI,我使用的是windows 7 32bit,dev c

标签: c


【解决方案1】:

如果您期望终端输入,那么使用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""" 之外,没有任何标准可以让您知道可能的语言环境名称是什么,这也是不尝试设置语言环境的另一个原因,除非用户要求您这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多