Linux的设置地区

2023年7月21日,周五上午:

本来想试试把这篇文章设置成VIP可见的,因为我挺好奇设置了VIP可见后会发生什么,但后来想想觉得这有违自己写博客的初心,于是就放弃了。我写博客的初心就是传递其他人写博客的那种无私的分享精神,为社会、中文社区和世界贡献自己的价值。


目录


和地区有关的6个宏常量

 这6个宏常量是C 语言库函数中 locale.h 头文件中定义的宏常量。

虽然它们是C语言中的概念,但在Linux系统中也得到了支持。

  1. LC_CTYPE
  2. LC_COLLATE
  3. LC_MONETARY
  4. LC_NUMERIC
  5. LC_TIME
  6. 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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨龙之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值