作 web 无障碍相关的研究时,遇到的第一件事就是要给 <html>
设置正确的 lang
属性,这么简单的一件事,想也不用就写好了:<html lang="zh-CN">
,或者直接简写成 <html lang="zh">
,Bingo,能够去作其它事了。php
但仔细想想,好像有些问题html
zh
是什么鬼?拼音?明明是国际标准怎么会用中文拼音?CN
为何要大写?zh-CN
表示中国中文,zh-SG
表示新加坡中文,但都是用的简体中文,貌似没什么区别?佢系一个须刨嚟嘅
(它是一个刮胡刀),那屏幕阅读器是用普通话朗读仍是用粤语朗读呢?为了一探究竟,我决定开始了解下语言标记是如何定义的。git
先从 lang
属性的定义开始,参考 MDN 上关于 lang 上的解释,它是由 IETF 的 BCP47 规范来定义的, 根据 BCP47 规范的描述,它是 RFC5646 与 RFC4647 这两个规范的最佳实践合集,其中取代了 RFC4646、RFC3066、RFC1766 这三个旧的语言标签规范,最新的规范定义了语言标签的描述规则以下:github
language - extlang - script - region - variant - extension - privateuse
主语言 - 扩展语言(方言) - 书写文字 - 区域 - 变体 - 扩展 - 私有
复制代码
由子标签按顺序经过连字号(-)链接起来组成一个完整的语言标签,各子标签的格式遵循如下标准:web
这才刚开始讲,就遇到了一堆的专有名称,一堆的国际规范,用一个字形象我如今的心情:懵bash
对新规范的解读先停一下,咱们来先回过头来从 zh-CN
的历史开始讲起ide
1995年3月 IETF
(互联网工程任务组)发布最先的 RFC1766 语言标签规范,使用 ISO639-1 的2字母语言代码,ISO3166-1_alpha-2 的2字母国家地区代码并(约定大写)。ISO639-1 规范中汉语使用 zh
表示,来自“中文”的汉语拼音:Zhōngwén
。ISO3166-1_alpha-2 规范中中国的代码是 CN
,这大概就是 zh-CN
的由来,也是目前使用最广泛的一种中文语言标签。ui
2001年1月发布的 RFC3066 语言标签规范, 使用 ISO639-2 的3字母语言代码,汉语使用 zho
表示,一样来自“中文”的汉语拼音:Zhōngwén
的前3个字母。spa
2006年9月发布 RFC4646 (规范的主体)与 RFC4647 (处理匹配行为) 语言标签规范。 RFC4646 增长了使用 ISO15924 的4字母书写文字子标签,简体中文是 Hans
,繁体中文是 Hant
,以及 UNM.49 的3数字地理分区码。3d
2009年9月发布 RFC5646 ,引入了3字符码的 ISO639-3 与 ISO639-5 做为语言子标签,其中 ISO639-3 认定汉语文(zho
)是一个大语文(macrolanguage),包含14种语文,cdo
– 闽东语,cjy
– 晋语,cmn
– 普通话或國語,cpx
– 莆仙语,czh
– 徽语,czo
– 闽中语,gan
– 赣语,hak
– 客家话,hsn
– 湘语,mnp
– 闽北语,nan
– 闽南语,wuu
– 吴语,yue
– 粤语,lzh
- 文言文。
2009年9月发布的 BCP47 整合了 RFC4647 和 RFC5646 造成语言标签最佳实践,仍然使用 zh
做为大语文(macrolanguage)标签, ISO639-3 中引入的另外14种语文标签做为方言扩展标签,但推荐方言扩展标签直接做为主语言标签,所以赣语的标签以 zh-gan
或 gan
开头、粤语的以 zh-yue
或 yue
开头、普通话的以 zh-cmn
或 cmn
开头,BCP47 规范建议优先选择后者,但关于这点目前在业界是有争议的,广泛的观点是但愿保留 zh
做为主语言标签,这样能更好的向前兼容。
了解了语言标签规范的发展历史,咱们再回到 BCP47 规范,语言标签描述规则中的如下子标签:
language - extlang - script - region - variant - extension - privateuse
复制代码
在这些子标签中 推荐 使用 IANA语言子标签注册表 中的子标签格式,这些格式一般是来源于各类 ISO 标准中的通用约定。
示例1:region 的取值 CN(中国)
%%
Type: region
Subtag: CN
Description: China
Added: 2005-10-16
%%
复制代码
示例2:script 的取值 Hans(简体中文)
%%
Type: script
Subtag: Hans
Description: Han (Simplified variant)
Added: 2005-10-16
%%
复制代码
IANA语言子标签注册表中,如下 extlang
中的方言同时也被归类到了 language
中,BCP47 规范是建议将下面的 extlang
直接做为主语言使用,而我我的的建议是主语言仍然使用 zh
,而 extlang
做为扩展方言使用。
zh
中国字或中国话cdo
闽东语cjy
晋语cmn
普通话或國語cpx
莆仙语czh
徽语czo
闽中语gan
赣语hak
客家话hsn
湘语mnp
闽北语nan
闽南语wuu
吴语yue
粤语lzh
文言文Hans
简体汉字Hant
繁体汉字CN
CHINA 中国HK
HONG KONG 香港TW
Taiwan 台湾SG
Singapore 新加坡综上所述,从 BCP47 规范的定义中,咱们不难发现 zh-CN
这种语言标签的写法已通过时,不符合规范,如下从网上摘抄了一些标准的写法:
zh-Hans-CN
zh-Hant-TW
zh-Hans-CN
zh-lzh-Hans
zh-lzh-Hant
zh-Hans-CN
zh-Hans
简体中文(我的推荐)zh-Hans-CN
以简体中文书写的中国大陆用词zh-Hans-HK
以简体中文书写的香港地区用词zh-Hant
繁體中文zh-Hant-HK
以繁體中文書寫的香港地區用詞zh-Hant-TW
以繁體中文書寫的台灣地區用詞yue
粤语发音cmn
普通话或國語发音yue-Hans
以简体中文书写的粤语用词zh-yue-Hans
以简体中文书写的粤语用词(我的推荐)yue-Hant
以繁體中文書寫的粵語用詞cmn-Hans
以简体中文书写的普通话用词zh-cmn-Hans
以简体中文书写的普通话用词(我的推荐)cmn-Hans-CN
以简体中文书写的中国大陆普通话用词cmn-Hant-HK
以繁體中文書寫的香港地区普通話用詞cmn-Hant-TW
以繁體中文書寫的台湾地区國語用詞I'm Gafish 原创文章,首发于 个人博客,内容若有错误,还望指正,谢谢您的阅读。