HTML lang 没你想的那么简单

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

内容简介:做 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

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

查看所有标签

猜你喜欢:

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

.NET框架程序设计

.NET框架程序设计

(美)Jeffrey Richter、(美)Francesco Balena / 李建忠 / 华中科技大学出版社 / 2004-1 / 54.00元

Microsoft.NET框架为简化开发与卫联网无缝连接的应用程序和组件提供了强大的技术支持,如ASP.NET Web窗体、XML Web服务以及Windows窗体。本书的目的在于展示.NET框架中公共语言运行库存的核心内容。全书由两位广受尊敬的开发者/作者完成,并假设读者理解面向对象程序设计的基本概念,如数据抽象、继承和多态。书中内容清楚地解释了CLR的扩展类型系统,CLR如何管理类型的行为,以......一起来看看 《.NET框架程序设计》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

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

html转js在线工具