2023年7月21日,周五上午:
本来想试试把这篇文章设置成VIP可见的,因为我挺好奇设置了VIP可见后会发生什么,但后来想想觉得这有违自己写博客的初心,于是就放弃了。我写博客的初心就是传递其他人写博客的那种无私的分享精神,为社会、中文社区和世界贡献自己的价值。
目录
- 和地区有关的6个宏常量
- LC_CTYPE
- LC_COLLATE
- LC_MONETARY
- LC_NUMERIC
- LC_TIME
- LC_MESSAGES
- 函数 setlocale()
- 函数原型
- 使用方法
- 查询全部的6个宏常量的值
- 设置某个宏常量的值
和地区有关的6个宏常量
这6个宏常量是C 语言库函数中 locale.h
头文件中定义的宏常量。
虽然它们是C语言中的概念,但在Linux系统中也得到了支持。
- LC_CTYPE
- LC_COLLATE
- LC_MONETARY
- LC_NUMERIC
- LC_TIME
- LC_MESSAGES
在Linux操作系统的命令行中输入“locate”,可以查看这6个宏常量的值:
LC_CTYPE
LC_CTYPE
的英文全称是 "Locale Category Type"
LC_CTYPE
的值用于指定字符分类和字符转换的规则和算法。它影响字符的大小写转换、字符分类(如字母、数字、标点符号等)、字符宽度(如全角、半角字符)、字符编码等。
LC_CTYPE的值可以是:
en_US.UTF-8、ja_JP.UTF-8、zh_CN.UTF-8
en_US.UTF-8意为:英语(美国)、采用UTF-8编码
jp_JP.UTF-8意为:日语(日本)、采用UTF-8编码
zh_CH.UTF-8意为:中文(中国)、采用UTF-8编码
当将 LC_CTYPE
设置为不同的地域环境时,字符处理的行为会根据相应的语言规则进行调整。以下是使用英语、法语和德语示例:
en_US.UTF-8,英语环境下的字符处理:
- 字母大小写:在英语环境下,字符转换函数(如
tolower()
和toupper()
)会将大写字母转换为小写字母,反之亦然。 - 字符分类:英语环境中,字符分类函数(如
isalpha()
和isdigit()
)会根据英语字母表和数字规则对字符进行分类。 - 字符编码:字符编码通常使用 UTF-8 编码方式
fr_FR.UTF-8,法语环境下的字符处理
- 字母大小写:在法语环境下,字符转换函数会根据法语规则进行大小写转换。例如,字母 "i" 可能会在特定的上下文中转换为 "I"。
- 字符分类:法语环境中,字符分类可能与英语环境有所不同。法语字符集包含特定的字母、重音符号和特殊字符。
- 字符编码:字符编码通常使用 UTF-8 编码方式。
de_DE.UTF-8,德语环境下的字符处理:
- 字母大小写:在德语环境下,字符转换函数会根据德语规则进行大小写转换。例如,字母 "ß" 可能会转换为 "SS"。
- 字符分类:德语环境中,字符分类可能与英语环境有所不同。德语字符集包含特定的字母、重音符号和特殊字符。
- 字符编码:字符编码通常使用 UTF-8 编码方式。
LC_COLLATE
LC_COLLATE
是 "Locale Collation" 的缩写。Collation(整理;排序)
LC_COLLATE
用于指定排序和比较字符串时所采用的规则和算法。
当LC_COLLATE
值是en_US.UTF-8时,
,意为使用英语(美国)的字符串排序规则;
当前的LC_COLLATE
值是fr_FR.UTF-8,即使用法语(法国)的字符串排序规则。
当设置不同的 LC_COLLATE
值时,字符串排序的行为会有所不同。以下是以英语、法语和德语为例的说明:
在英语环境下,如果将 LC_COLLATE
设置为 en_US.UTF-8
,则字符串排序行为如下:
- 字母顺序:英语环境中,字符串排序通常按照字母表的顺序进行,不考虑大小写。例如,"apple" 在 "banana" 之前。
在法语环境下,将 LC_COLLATE
设置为 fr_FR.UTF-8
,字符串排序行为如下:
- 字母顺序:法语环境中,字符串排序通常按照字母表的顺序进行,但会考虑特定的重音符号和字符变体。例如,"école" 可能会在 "enfant" 之前。
在德语环境下,将 LC_COLLATE
设置为 de_DE.UTF-8
,字符串排序行为如下:
- 字母顺序:德语环境中,字符串排序按照字母表的顺序进行,但会考虑特定的字母变体和字符变体。例如,"Äpfel" 可能会在 "Zebra" 之前。
LC_MONETARY
LC_MONETARY
的英文全称是 "Locale Category Monetary"
LC_MONETARY
用于指定货币相关的设置,如货币符号、货币格式、小数点符号等。通过设置 LC_MONETARY
,可以根据不同的语言、地区和文化习惯来格式化和显示货币金额。
以下是以英语、法语和德语为例的说明:
在英语环境下,如果将 LC_MONETARY
设置为 en_US.UTF-8
,则货币格式化行为如下:
- 货币符号:英语环境中,货币符号通常是在金额前面显示的,如 "$100" 。
- 千位分隔符:英语环境中,常使用逗号作为千位分隔符,例如 1,000。
- 小数点符号:英语环境中,常使用点号作为小数点符号,例如 12.34。
在法语环境下,将 LC_MONETARY
设置为 fr_FR.UTF-8
,货币格式化行为如下:
- 货币符号:法语环境中,货币符号通常是在金额后面显示的,如 "100€" 。
- 千位分隔符:法语环境中,常使用空格作为千位分隔符,例如 1 000。
- 小数点符号:法语环境中,常使用逗号作为小数点符号,例如 12,34。
在德语环境下,将 LC_MONETARY
设置为 de_DE.UTF-8
,货币格式化行为如下:
- 货币符号:德语环境中,货币符号通常是在金额前面显示的,如 "€100" 。
- 千位分隔符:德语环境中,常使用点号作为千位分隔符,例如 1.000。
- 小数点符号:德语环境中,常使用逗号作为小数点符号,例如 12,34。
LC_NUMERIC
LC_NUMERIC
的英文全称是 "Locale Category Numeric"
LC_NUMERIC
是一个环境变量,用于设置数字格式化的地域设置。它影响数字的显示格式、小数点符号、千位分隔符等。
以下是以英语、法语和德语为例的说明:
在英语环境下,如果将LC_NUMERIC设置为en_US.UTF-8,则数字格式化行为如下:
- 小数点符号:英语环境中,小数点通常用"."表示,例如1.23。
- 千位分隔符:英语环境中,常使用逗号作为千位分隔符,例如1,000。
在法语环境下,将LC_NUMERIC设置为fr_FR.UTF-8,数字格式化行为如下:
- 小数点符号:法语环境中,小数点通常用","表示,例如1,23。
- 千位分隔符:法语环境中,常使用空格作为千位分隔符,例如1 000。
在德语环境下,将LC_NUMERIC设置为de_DE.UTF-8,数字格式化行为如下:
- 小数点符号:德语环境中,小数点通常用","表示,例如1,23。
- 千位分隔符:德语环境中,常使用点号作为千位分隔符,例如1.000。
LC_TIME
LC_TIME 的英文全称是 "Locale Category Time"
LC_TIME 用于设置时间格式化的地域设置。它影响时间的显示格式、日期的表示方式、星期几的命名等。
以下是以英语、法语和德语为例的说明:
在英语环境下,如果将 LC_TIME 设置为 en_US.UTF-8,则时间格式化行为如下:
- 日期表示:英语环境中,通常以 "Month Day, Year" 的格式表示日期,例如 "January 1, 2022"。
- 星期几表示:英语环境中,通常以星期的全名表示,例如 "Monday"。
在法语环境下,将 LC_TIME 设置为 fr_FR.UTF-8,时间格式化行为如下:
- 日期表示:法语环境中,通常以 "Day Month Year" 的格式表示日期,例如 "1 janvier 2022"。
- 星期几表示:法语环境中,通常以星期的缩写表示,例如 "lun." 表示星期一。
在德语环境下,将 LC_TIME 设置为 de_DE.UTF-8,时间格式化行为如下:
- 日期表示:德语环境中,通常以 "Day. Month Year" 的格式表示日期,例如 "1. Januar 2022"。
- 星期几表示:德语环境中,通常以星期的全名表示,例如 "Montag"。
LC_MESSAGES
LC_MESSAGES 的英文全称是 "Locale Category Messages"
LC_MESSAGES 用于设置程序的消息语言环境。它影响程序输出的语言,包括错误消息、警告信息、提示文本等。
以下是以英语、法语和德语为例的说明:
在英语环境下,如果将 LC_MESSAGES 设置为 en_US.UTF-8,则程序输出的消息语言将为英语。
在法语环境下,将 LC_MESSAGES 设置为 fr_FR.UTF-8,程序输出的消息语言将为法语。
在德语环境下,将 LC_MESSAGES 设置为 de_DE.UTF-8,程序输出的消息语言将为德语。
函数 setlocale()
函数原型
函数 setlocale()既可设置也可查询程序的当前地区。
#include<locale.h>
char *setlocale(int category,const char *locale);
category 参数选择设置或查询上述6个宏常量中的哪一个。此外,也可以是"LC_ALL",意为选择全部的6个宏常量。
locale 参数可以为空字符串"",也可以写类似“en_US.UTF-8”的字符串。当此参数为空字符串""时,意为查询category参数指向的宏常量的值
使用方法
查询全部的6个宏常量的值
#include<locale.h>
#include<stdio.h>
int main(){
char *ctype,*collate,*monetary,*numeric,*time,*message;
ctype=setlocale(LC_CTYPE,"");
collate=setlocale(LC_COLLATE,"");
monetary=setlocale(LC_MONETARY,"");
numeric=setlocale(LC_NUMERIC,"");
time=setlocale(LC_TIME,"");
message=setlocale(LC_MESSAGES,"");
printf("LC_CYPE=%s\n",ctype);
printf("LC_COLLATE=%s\n",collate);
printf("LC_MONETARY=%s\n",monetary);
printf("LC_NUMERIC=%s\n",numeric);
printf("LC_TIME=%s\n",time);
printf("LC_MESSAGE=%s\n",message);
}
设置某个宏常量的值
按理来说,应该可以设置的,但我没设置成功,可能是系统阻拦了吧...
#include<locale.h>
#include<stdio.h>
int main(){
char *time;
//查看先前的LC_TIME的值
time=setlocale(LC_TIME,"");
printf("before: LC_TIME=%s\n",time);
//修改LC_TIME的值为fr_Fr.UTF-8
time=setlocale(LC_TIME,"fr_FR.UTF-8");
//查看修改后的LC_TIME的值
time=setlocale(LC_TIME,"");
printf("after: LC_TIME=%s\n",time);
}