HTML lang没想象中的那么简单
前言
今天心血来潮,想试试看自己的博客页面是否符合W3C标准。结果这一检测,上来就提示我说——<html lang="zh-CN">
不符合标准。
What????
大家给 <html>
设置 lang
属性的时候,不都是写<html lang="zh-CN">
,或者干脆直接简写成 <html lang="zh">
吗?这咋还不符合标准规范了?但仔细想一想,好像是有些问题。
首先,zh
是什么鬼?拼音?明明是国际标准怎么会用中文拼音?其次,CN
为什么要大写?第三,zh-CN
表示中国中文,zh-SG
表示新加坡中文,但这两个国家都使用简体中文,貌似没什么区别呀?第四,如果页面上显示的是用中文是一个粤语用词,如佢系一个须刨嚟嘅
(它是一个刮胡刀),那屏幕阅读器是用普通话朗读还是用粤语朗读呢?
带着这些问题,以及如何才能符合W3C标准规范,我决定开始了解下语言标记是如何定义的。
过程
先从lang
属性的定义开始。参考MDN上关于 lang 上的解释可知,它是由 IETF 的 BCP47 规范来定义的。根据 BCP47 规范的描述,它是 RFC5646 与 RFC4647 这两个规范的最佳实践合集,用于取代 RFC4646、RFC3066、RFC1766 这三个旧的语言标签规范。最新的规范定义了语言标签的描述规则如下:
language - extlang - script - region - variant - extension - privateuse
主语言 - 扩展语言(方言) - 书写文字 - 区域 - 变体 - 扩展 - 私有
由子标签按顺序通过连字号(-)连接起来组成一个完整的语言标签,各子标签的格式遵循以下标准:
- language:ISO639-1 (2002)的2字母语言代码,ISO639-2 (1998) 或 ISO639-3 (2007) 或 ISO639-5 (2008)的3字母语言代码
- extlang:ISO639-3 每个由3字母组成
- script:ISO15924 的4字母书写文字代码
- region:ISO3166-1_alpha-2 的2字母地区代码(通常大写),或UNM.49的3数字地理区代码
- variant:IANA语言子标签注册表 每个为5至8个字母,或者4字母后跟1个数字
- extension:暂时未知
- privateuse:暂时未知
看完上面的解释介绍,估计大家的内心基本都是这样的→ 😒😖🥴😵。这才刚开始讲,就遇到了一堆的专有名称,一堆的国际规范,用一个字形容我此刻的心情——懵!
对新规范的解读先暂停一下,我们还是先回过头从zh-CN
的历史开始讲起吧。
历史
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
的由来,也是目前使用最普遍的一种中文语言标签。
2001年1月发布的 RFC3066 语言标签规范,使用 ISO639-2 的3字母语言代码,汉语用zho
表示,同样来自“中文”的汉语拼音 Zhōngwén
的前3个字母。
2006年9月发布 RFC4646(规范的主体)与 RFC4647(处理匹配行为)语言标签规范。 RFC4646 增加了使用 ISO15924 的4字母书写文字子标签,简体中文是Hans
,繁体中文是Hant
,以及 UNM.49 的3数字地理分区码。
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
作为主语言标签,这样能更好的向前兼容。
IANA 语言子标签注册表
了解了语言标签规范的发展历史,我们再回到 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
直接作为主语言使用。我再测验W3C的web标准时,发现W3C仍然建议是主语言使用zh
,而extlang
作为扩展方言使用。
language
zh
中国字或中国话
extlang
cdo
闽东语cjy
晋语cmn
普通话或國語cpx
莆仙语czh
徽语czo
闽中语gan
赣语hak
客家话hsn
湘语mnp
闽北语nan
闽南语wuu
吴语yue
粤语lzh
文言文
script
Hans
简体汉字Hant
繁体汉字
region
CN
CHINA 中国HK
HONG KONG 香港TW
Taiwan 台湾SG
Singapore 新加坡
正确的写法
综上所述,从 BCP47 规范的定义中,我们不难发现zh-CN
这种语言标签的写法已经过时,不符合规范,所以我从网上摘抄了一些标准的写法——
文字例子
圆珠笔
zh-Hans-CN
原子筆
zh-Hant-TW
它是一个刮胡刀
zh-Hans-CN
佢系一个须刨嚟嘅
yue-Hans
佢係一個鬚刨嚟嘅
yue-Hant
驴不胜怒,蹄之
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
以繁體中文書寫的台湾地区國語用詞