setlocale()是用来做什么的?

3
我正在学习C++,发现了C++库的这个函数:setlocale (http://www.cplusplus.com/reference/clocale/setlocale/),但我不知道它的作用是什么。
在Ubuntu上,我使用了以下代码: printf ("Locale is: %s\n", setlocale(LC_ALL,"") ); 它会输出:Locale is: en_US.UTF-8 但在macOS上,它会输出: Locale is: C,这个C代表什么?
这个函数应该在什么情况下以及如何使用?

1
似乎与货币、日期和其他特定地区的输入解释有关。 - undefined
从http://www.cplusplus.com/reference/clocale/ "C"区域设置是最小的区域设置。它是一个相当中立的区域设置,所有系统和编译器都具有相同的设置,因此使用此区域设置的程序的确切结果是可预测的。这是所有C程序默认使用的区域设置。 - undefined
2个回答

3

阅读Linux上的setlocale(3)locale(7)手册。还可以阅读internationalization and localization维基页面。

在Debian和Ubuntu上,您可能需要(以root身份)运行dpkg-reconfigure locales以添加更多语言环境。

然后,您可以设置LANG(以及LC_ALL和其他变量),以更改消息的语言(请参见environ(7))。

例如,我安装了法语UTF-8语言环境。如果我执行以下操作:

% env LC_ALL=fr_FR.UTF-8 ls /tmp/nonexisting 

我收到的错误信息是法语:

ls: impossible d'accéder à '/tmp/nonexisting': Aucun fichier ou dossier de ce type

如果我使用默认的 C 语言环境,那么它会显示为英文:
% env LC_ALL=C ls /tmp/nonexisting
ls: cannot access '/tmp/nonexisting': No such file or directory

作为经验法则,您需要在运行此论坛上展示的命令之前执行export LC_ALL=C LANG=C(例如,因为您不想显示编译器或shell的错误消息为法语)。
如果您正在编写一个希望国际化的程序(例如,易于仅理解法语或中文的人使用),您至少需要使用gettext(3)(特别是对于printf格式字符串!)和可能需要使用textdomain(3),并且您将需要使用msgfmt(1)来处理消息目录。当然,您需要构建翻译消息的目录。

本地化还影响数字的解析和打印方式(使用逗号或点分隔千位或小数位),以及货币和时间的打印和解析方式(例如strftime(3))。


问题:当我尝试使用LC_ALL=fr_FR.UTF-8 ls /tmp/nonexisting命令时,我得到了混合的法语和英语信息:ls: impossible d'accéder à '/tmp/nonexisting': No such file or directory。有没有办法让所有的回答都是法语的?我的bash版本是5.0.11。任何帮助将不胜感激。 - undefined

1
这是与地区相关的设置。例如,在某些国家,逗号用作小数分隔符,而在其他国家则使用点号。在美国,22,001通常被理解为22千1,而在一些欧洲国家则表示为22.001。
日期可以按照DD/MM/YYYYY(大多数欧洲)或MM/DD/YYYY(美国)格式给出等等。

在什么情境下以及如何使用它? - undefined
当你希望程序在使用不同约定的地方执行时... - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接