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 上的解释可知,它是由 IETFBCP47 规范来定义的。根据 BCP47 规范的描述,它是 RFC5646RFC4647 这两个规范的最佳实践合集,用于取代 RFC4646RFC3066RFC1766 这三个旧的语言标签规范。最新的规范定义了语言标签的描述规则如下:

language  -  extlang       -  script  -  region  -  variant  -  extension  -  privateuse
主语言     -  扩展语言(方言)  -  书写文字  -  区域    -  变体      -  扩展       -  私有

由子标签按顺序通过连字号(-)连接起来组成一个完整的语言标签,各子标签的格式遵循以下标准:

看完上面的解释介绍,估计大家的内心基本都是这样的→ 😒😖🥴😵。这才刚开始讲,就遇到了一堆的专有名称,一堆的国际规范,用一个字形容我此刻的心情——

对新规范的解读先暂停一下,我们还是先回过头从zh-CN的历史开始讲起吧。

历史

1995年3月 IETF(互联网工程任务组)发布了最早的 RFC1766 语言标签规范。这套规范使用 ISO639-1 的2字母语言代码,ISO3166-1_alpha-2 的2字母国家地区代码并约定大写。ISO639-1 规范中汉语使用zh表示,来自“中文”的汉语拼音:ZhōngwénISO3166-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-3ISO639-5 作为语言子标签。其中,ISO639-3 认定汉语文(zho)是一个大语文(macrolanguage),包含14种语文:cdo – 闽东语,cjy – 晋语,cmn – 普通话或國語,cpx – 莆仙语,czh – 徽语,czo – 闽中语,gan – 赣语,hak – 客家话,hsn – 湘语,mnp – 闽北语,nan – 闽南语,wuu – 吴语,yue – 粤语,lzh - 文言文。

2009年9月发布的 BCP47 整合了 RFC4647RFC5646 形成语言标签最佳实践,仍然使用zh作为大语文(macrolanguage)的标签,辅以 ISO639-3 中引入的另外14种语文标签作为方言扩展标签,但推荐方言扩展标签直接作为主语言标签。因此,赣语的标签以zh-gangan开头、粤语以zh-yueyue开头、普通话以zh-cmncmn开头,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 以繁體中文書寫的台湾地区國語用詞

资料参考