什么是setlocale()?

时间:2017-10-25 18:43:25

标签: c locale setlocale

我正在学习c ++,我发现了C ++库的这个功能: setlocalehttp://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意味着什么?

在什么情况下应该如何使用?

2 个答案:

答案 0 :(得分:1)

在Linux上阅读setlocale(3)locale(7)手册页。另请阅读internationalization and localization wikipage。

在Debian和Ubuntu上,您可以(以root身份)运行LANG以添加更多区域设置。

然后,您可以设置LC_ALL(以及% env LC_ALL=fr_FR.UTF-8 ls /tmp/nonexisting 和其他)环境变量(请参阅environ(7))以更改消息的语言。

例如,我安装了法语UTF-8语言环境。如果我做

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

根据经验,在运行您在此论坛上展示的命令之前,您需要printf(例如,因为您不希望以法语显示来自编译器或shell的错误消息)。

如果您编码您希望国际化的程序(例如,只有了解法语或中文的人才能轻松使用),您至少需要使用gettext(3) (特别是对于const logger = new (winston.Logger)({ transports : [ new winston.transports.PostgreSQL({ connString : 'xxxxxxxxxxx', schema : 'public', //tableName : 'logEntry', customSql:'INSERT INTO public."logEntry"(logLevel, msg, meta) VALUES ($1, $2, $3);', }) ]; }); 格式字符串!)和textdomain(3),您需要使用msgfmt(1)来处理消息目录。当然,您需要构建已翻译消息的目录。

本地化也会影响数字的分析和打印方式(用逗号或点分隔数千或十进制数字)以及如何打印和解析金钱和时间(例如strftime(3))。

答案 1 :(得分:0)

它的特定于语言环境的设置。例如,在某些国家/地区,逗号用于小数点分隔符,而在其他国家/地区,则使用逗号。在美国,22,001通常被理解为22,000和1,在一些欧洲国家,22点001。

日期可以DD / MM / YYYYY(欧洲大部分地区)或MM / DD / YYYY(美国)格式提供,依此类推。