Lua os.setlocale()

前言#

今天来看一个比较神秘的函数,这个函数用起来让人很迷糊,虽然用了半天却搞不懂他是干嘛的,说实话,研究这个函数也花了我不少的时间,期间走了不少弯路,尝试了不同的方法,从源码到出处查了好多资料,接下来我决定用通俗的语言来解释一下这个函数。

这个函数其实就是满足不同人的习惯的,为什么这么说呢?我来举一个例子,假设C语言里有一个打印手机号的标准函数printPhoneNumber(const char* phonenum)(我杜撰的,嘿嘿),那么为了看起来更方便,可能会加一些分割符,我们知道不同的人读手机号的习惯不同,可能是是XXX-XXXX-XXXX,或者是XXXX-XXXX-XXX,还可能是XXX-XXX-XXXXX,再次假设有三个地区A、B、C,每个地区的人按一种读法来读手机号,那么为了编程方便也为了人们读起来更方便,在调用printPhoneNumber(const char* phonenum)之前,调用os.setlocale()来设置区域就可以按当地的习惯来显示手机号了,比如设置成区域A,打印手机号就会按XXX-XXX-XXXXX显示,是不是很方便?其实os.setlocale()并不是用来控制手机号显示的,而是用来控制一些和人们息息相关的一些事情,比如日期显示格式,这个不同的国家不一样吧,还有货币显示,字符比较等等。

内容#


os.setlocale()##

  • 原型:os.setlocale (locale [, category])
  • 解释:设置程序的当前区域,函数返回设置以后该项最新的值,如果失败则返回nil
  • 参数:两个参数均可省略,但具体含义不同。
  • locale:表示一个指定当前设置区域的字串,有几种特殊形式如下
    • "":一个空字串,当前设置被视为本地设置
    • "C":当前设置被视为标准C设置
    • nil:返回category指示设置名的当前值
  • category:一个描述要更改的设置名,实际上就是制定一个分类的名字,分类如下
    • all:默认选项,包含下述所用分类。
    • collate :影响C语言函数strcoll和strxfrm
    • ctype:影响字符处理函数和多行字符处理函数
    • monetary:影响C语言函数localeconv返回的货币格式化信息
    • numeric:影响格式化输入输出字符中的小数点符号
    • time:影响C语言函数strftime

Usage##

  • 首先我们来新建一个文件,文件命名为setlocaletest.lua然后编写如下代码:
-- 首先查询一下初始的区域设置
print(os.setlocale(nil)) 

-- 设置成中文简体区域
print(os.setlocale("chs")) 

-- 其实这两个是无效的,就看看返回值
print(os.setlocale("En-Us")) 
print(os.setlocale("zh_CN")) 

-- 设置成英文区域
print(os.setlocale("eng")) 

-- 设置成中文繁体区域
print(os.setlocale("cht")) 
print()

-- 现在只将数字部分设置成中文简体区域
print(os.setlocale("chs","numeric")) 

-- 打印一下时间
-- 实际上现在的时间部分还是中文繁体区域
print(os.setlocale(nil,"time").."'s time format as follow:")
print(os.date("%c").."\n")

-- 现在将时间部分设置成英文区域
print(os.setlocale("eng","time")) 

-- 再打印时间对比一下
print(os.setlocale(nil,"time").."'s time format as follow:")
print(os.date("%c").."\n")


-- 最后看一下当前的区域设置
print(os.setlocale(nil)) 
  • 运行结果
setlocale.png

总结#

  • 首先来看一些结果中的第一行“C”,表明现在的区域设置是“C”,原因是当C语言程序初始化时(刚进入到 main() 时),locale 被初始化为默认的 C locale,其采用的字符编码是所有本地 ANSI 字符集编码的公共部分,是用来书写C语言源程序的最小字符集(所以才起locale名叫:C)。
  • 由结果的3、4行来看当设置的区域错误时,会返回nil,到底可以设置哪些区域呢,下边我来列举常用的一部分:
语言缩写 语言种类 语言代码
chs 简体中文 0804
cht 繁体中文 0404
jpn 日文 0011
kor 韩文 0012
dan 丹麦文 0006
deu 德文 0007
eng 国际英文 0809
enu 英文 0409
esp 西班牙文 000A
fin 芬兰文 000B
fra 法文(标准) 040C
frc 加拿大法文 0C0C
ita 意大利文 0010
nld 荷兰文 0013
nor 挪威文 0014
plk 波兰文 0015
ptb 巴西葡萄牙文 0416
ptg 葡萄牙文 0816
rus 俄文 0019
sve 瑞典文 001D
tha 泰文 001E
  • 由两次显示时间格式的不同可以体现os.setlocale() 的作用,在中文繁体区域下时间有上午和下午的区分,但是在英文区域下就没有了,而转化为了24小时的表现方法。
  • 当参数locale为一个空字串,当前设置被视为本地设置,比如我在运行时就会被设置成中文简体。
  • 最后我们在查询设置情况时发现,不同的分类被设置成了不同的区域,这也是符合条件的。
  • 还有一点,这个函数os.setlocale() 由于依赖了C语言函数setlocale是线程不安全的,使用时要注意这一点。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容