LINUX本地的locale设置使用/etc/sysconfig/i18n进行设置,
这里的i18n是术语internationalization的缩写i加上18字符
在加上n,这样更为方便,同时区一样LINUX地区系统维护在
/usr/share/locale中,该目录下每个目录都是特定地区信息
的集合,目录的约定为:
language(ISO语言代码)[_territory(ISO国家代码)[.codeset(字符集)]][@modifier(如果前面都一样这个用于区分)]
一般只包含language(语言)_territory(国家)
如:
zh_CN:中文-中国
en_US:英文-美国
fr_CH:瑞士-法语
而每一个目录包含了具体的规则如:
LC_CTYPE:字符分类,大小写转换
LC_COLLATE:字符集排序规则
LC_MONETARY:对币值的格式化规则
LC_NUMERIC:对比值以外数据的格式化隔着
LC_TIME:时间日志的规则
LC_MESSAGES:
我们可以locale 查看这些信息,如果设置i18n为一个不存在的目录那么将会报错
[root@testmy locale]# more /etc/sysconfig/i18n
LANG="123.UTF-8"
[root@testmy locale]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
这里我们注意一下:
LANG
LC_ALL
LC_*
i18n配置文件
的区别
i18n<LANG<LC_*
也就是LANG会比i18n优先级高,LC_*比LANG高,而LC_ALL实际就是一次设置全部的LC_*而已
但是一旦设置了LC_ALL就不能设置LC_*了,所以一般不用。
一般我们使用LANG来设置全部的LC_*,而独立设置一个LC_*为想要的设置
比如我这里设置LANG=en_US.UTF-8 ,设置LC_TIME=zh_GN.UTF-8
目的在于输出时间以中文形式输出
[root@testmy ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[root@testmy ~]# date
Wed Dec 7 09:02:28 CST 2016
[root@testmy ~]# export LC_TIME=zh_CN.UTF-8
[root@testmy ~]# date
2016年 12月 07日 星期三 09:03:23 CST
使用程序验证LANG的优先级低于LC_TIME
[root@testmy ~]# LANG=zh_CN.UTF-8 LC_TIME=en_US.UTF-8 ./a.out
ctime() is:Wed Dec 7 10:49:32 2016
asmtime is:Wed Dec 7 10:49:32 2016
stftime() is:Wednesday 2016-12-07 10:49:32 CST
[root@testmy ~]# LANG=en_US.UTF-8 LC_TIME=zh_CN.UTF-8 ./a.out
ctime() is:Wed Dec 7 10:49:35 2016
asmtime is:Wed Dec 7 10:49:35 2016
stftime() is:星期三 2016-12-07 10:49:35 CST
代码:
这里的i18n是术语internationalization的缩写i加上18字符
在加上n,这样更为方便,同时区一样LINUX地区系统维护在
/usr/share/locale中,该目录下每个目录都是特定地区信息
的集合,目录的约定为:
language(ISO语言代码)[_territory(ISO国家代码)[.codeset(字符集)]][@modifier(如果前面都一样这个用于区分)]
一般只包含language(语言)_territory(国家)
如:
zh_CN:中文-中国
en_US:英文-美国
fr_CH:瑞士-法语
而每一个目录包含了具体的规则如:
LC_CTYPE:字符分类,大小写转换
LC_COLLATE:字符集排序规则
LC_MONETARY:对币值的格式化规则
LC_NUMERIC:对比值以外数据的格式化隔着
LC_TIME:时间日志的规则
LC_MESSAGES:
我们可以locale 查看这些信息,如果设置i18n为一个不存在的目录那么将会报错
[root@testmy locale]# more /etc/sysconfig/i18n
LANG="123.UTF-8"
[root@testmy locale]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
这里我们注意一下:
LANG
LC_ALL
LC_*
i18n配置文件
的区别
i18n<LANG<LC_*
也就是LANG会比i18n优先级高,LC_*比LANG高,而LC_ALL实际就是一次设置全部的LC_*而已
但是一旦设置了LC_ALL就不能设置LC_*了,所以一般不用。
一般我们使用LANG来设置全部的LC_*,而独立设置一个LC_*为想要的设置
比如我这里设置LANG=en_US.UTF-8 ,设置LC_TIME=zh_GN.UTF-8
目的在于输出时间以中文形式输出
[root@testmy ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[root@testmy ~]# date
Wed Dec 7 09:02:28 CST 2016
[root@testmy ~]# export LC_TIME=zh_CN.UTF-8
[root@testmy ~]# date
2016年 12月 07日 星期三 09:03:23 CST
使用程序验证LANG的优先级低于LC_TIME
[root@testmy ~]# LANG=zh_CN.UTF-8 LC_TIME=en_US.UTF-8 ./a.out
ctime() is:Wed Dec 7 10:49:32 2016
asmtime is:Wed Dec 7 10:49:32 2016
stftime() is:Wednesday 2016-12-07 10:49:32 CST
[root@testmy ~]# LANG=en_US.UTF-8 LC_TIME=zh_CN.UTF-8 ./a.out
ctime() is:Wed Dec 7 10:49:35 2016
asmtime is:Wed Dec 7 10:49:35 2016
stftime() is:星期三 2016-12-07 10:49:35 CST
代码:
点击(此处)折叠或打开
- #include<stdio.h>
- #include <time.h>
- #include <errno.h>
- #include <locale.h>
- #include <unistd.h>
- #include <stdlib.h>
-
-
- int main(void)
- {
- time_t t;
- struct tm *loc;
- char* ctc;
- char* asc;
- char ut[200];
-
- t = time(NULL);
- if(setlocale(LC_ALL,"") == NULL) //LC_ALL,"" will use env vars
- {
- perror("setlocale:");
- exit(1);
- }
- ctc = ctime(&t);
- if ((loc = localtime(&t)) ==NULL)
- {
- perror("localtime:");
- exit(2);
- }
-
- asc = asctime(loc);
-
- if(strftime(ut,200,"%A %F %T %Z\n",loc) == 0)
- {
- perror("strftime:");
- exit(3);
- }
-
- printf("ctime() is:%sasmtime is:%sstftime() is:%s",ctc,asc,ut);
- return 0;
-
- }