HTML lang 没你想的那么简单

栏目: Html · 发布时间: 4年前

内容简介:做 web 无障碍相关的研究时,遇到的第一件事就是要给但仔细想一想,好像有些问题为了一探究竟,我决定开始了解下语言标记是如何定义的。

做 web 无障碍相关的研究时,遇到的第一件事就是要给 <html> 设置正确的 lang 属性,这么简单的一件事,想也不用就写好了: <html lang="zh-CN"> ,或者直接简写成 <html lang="zh"> ,Bingo,可以去做其它事了。

但仔细想一想,好像有些问题

  • zh 是什么鬼?拼音?明明是国际标准怎么会用中文拼音?
  • CN 为什么要大写? zh-CN 表示中国中文, zh-SG 表示新加坡中文,但都是用的简体中文,貌似没什么区别?
  • 如果页面上显示的是用中文显示的粤语用词,如 佢系一个须刨嚟嘅 (它是一个刮胡刀),那屏幕阅读器是用普通话朗读还是用粤语朗读呢?

为了一探究竟,我决定开始了解下语言标记是如何定义的。

过程

先从 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:暂未知
HTML lang 没你想的那么简单

这才刚开始讲,就遇到了一堆的专有名称,一堆的国际规范,用一个字形象我现在的心情:懵

对新规范的解读先停一下,我们来先回过头来从 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-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 直接作为主语言使用,而我个人的建议是主语言仍然使用 zh ,而 extlang 作为扩展方言使用。

language

  • zh 中国字或中国话

extlang

cdo
cjy
cmn
cpx
czh
czo
gan
hak
hsn
mnp
nan
wuu
yue
lzh

script

Hans
Hant

region

CN
HK
TW
SG

正确的写法

综上所述,从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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

U一点·料

U一点·料

阿里巴巴集团 1688用户体验设计部 / 机械工业出版社 / 2015-7-13 / 79.00元

《U一点·料——阿里巴巴1688UED体验设计践行之路》是1688UED团队历经多年实践之后的心血之作,书中以“道─术─器”的思路为编排脉络,从设计观、思考体系、方法论上层层剖析,将零散的行业knowhow串成体系,对“UED如何发展突破”提出了自己的真知灼见。该书重实战、讲方法、求专业、论文化,是一部走心的诚意之作。 本书作者从美工到用户体验设计师,从感性随意到理性思考,从简单的PS做图到......一起来看看 《U一点·料》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具