前言

做 web 无障碍相关的研究时,遇到的第一件事就是要给 设置正确的 lang 属性,这么简单的一件事,想也不用就写好了:,或者直接简写成 ,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:暂未知

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

对新规范的解读先停一下,我们来先回过头来从 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 直接作为主语言使用,而我个人的建议是主语言仍然使用 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 以繁體中文書寫的台湾地区國語用詞

资料参考

*I'm Gafish 原创文章

html语言如此简单,HTML lang 没你想的那么简单相关推荐

  1. 实锤!Python 真没你想的那么简单…

    首先我不可否认,Python确实很"火"!很多开发者都把它当做主语言或是第二语言. 当做主语言原因很好理解,因为最近几年它在人工智能.数据分析.Web开发等众多领域都有着非常成熟的 ...

  2. 《魂斗罗:归来》手游子弹中没中,没你想得那么简单!

    无数玩家童年的神作重新回归,手机端多人联机,呼朋引伴一起重温当年的热血大作. 除了IP,剧情,对工程师而言,<魂斗罗:归来>更要解决的联机同步和命中同步等问题,简单说,一颗子弹打没打中,没 ...

  3. 《魂斗罗:归来》子弹中没中,没你想得那么简单!

    无数玩家童年的神作重新回归,手机端多人联机,呼朋引伴一起重温当年的热血大作.除了IP,剧情,对工程师而言,<魂斗罗:归来>更要解决的联机同步和命中同步等问题,简单说,一颗子弹打没打中,没你 ...

  4. set 有序吗js_JavaScript Set没你想的那么简单!

    原标题:JavaScript Set没你想的那么简单! 来源 | blog.greenroots.info 译者 | 鬼哥 在本文中,我们将学习Set,并且使用几个小例子来彻底掌握Set,进来的小伙伴 ...

  5. 分页缓冲池如何关闭_线程池没你想的那么简单

    前言 原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它:但在动手写的过程中落地到细节时发现并没想的那么容易.结合源码对比后确实不得不佩服 Doug Le ...

  6. 大公司为什么都有API网关?没你想的那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:rrd.me/g6eyJ 在这篇文章中将我们一起来探讨当前的 ...

  7. 【Python】Python中的for循环,没你想的那么简单~

    公众号:尤而小屋 作者:Peter 编辑:Peter 一年四季,循环往复:说到底就是一个循环的问题 for语句实际上解决的是循环问题.在很多的高级语言中都有for循环(for loop). for语句 ...

  8. Interrupted Exception异常可能没你想的那么简单!

    摘要: 当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常.如果我们对InterruptedException异常处理 ...

  9. 怎么把字符串变成数组_Java中字符串split() 的使用方法,没你想的那么简单

    先看下面的方法,事先预测一下,经过split方法,按逗号进行分割为数组之后,生成的数组的长度是多少,目测很多人都觉得是8,但是结果却出乎意料.是5而不是8. private static void t ...

最新文章

  1. 低代码、无代码?深度解读硅谷新趋势
  2. axios + router4 + mobx:对于全局登录的思考
  3. 【转载】fullpage.js学习
  4. 关于Angular样式封装
  5. java 基础数据结构源码详解及数据结构算法
  6. ofo这事吧,其实也挺好的
  7. 项目中常用到的正则(价格千位分割格式化,手机号3-4-4格式化,密码验证,去除空格,获取url参数,检测24小时时间制,检测url前缀,检测中文,检测手机号,英文单词前后加空格,判断版本号)
  8. 节约里程法matlab程序_物流配送路径优化研究 毕业论文.doc
  9. FAR花菜一个前所未有的机遇
  10. matlab figure 虚线圆,flutter 画圆,虚线圆,渐变圆
  11. 两分钟内教会你如何给视频加配音,快速掌握配音技巧!
  12. 七种寻址方式(基址加变址寻址方式)
  13. echart图表(自定义提示框) 鼠标移动到数据展示区自定义展示提示框 天/时/分/秒
  14. windows上获取系统时间
  15. 微信小程序顶部渐变色实现
  16. 总结运用kali破解WIFI密码的多种方法
  17. 雷蛇 笔记本 装linux,顺应民意:雷蛇考虑开发Linux版Blade游戏本
  18. 计算机设备内存,外部设备访问计算机内存的方法与流程
  19. 基于cocoCreator版本2.4.5整理一款2D小游戏快速开发的游戏框架
  20. 如何利用 GitHub 从零开始搭建一个博客

热门文章

  1. magic-把项目中的石头变成垫脚石
  2. 七夕节有病毒入侵 慎对QQ好友送玫瑰(转)
  3. fortran中如何提供计算程序运行时间?
  4. BAT54肖特基二极管;引脚配置 BAV99 串联二极管规格
  5. AAAI 2021论文接收列表内有关因果的文章
  6. 性能优化之YUICompressor压缩JS、CSS
  7. 华为机试:连续出牌数量
  8. 换友情链接时候是换Http的还是Https的好?
  9. 计算机类专业工程认证,我校计算机科学与技术、测绘工程专业通过中国工程教育专业认证...
  10. 互联网怎么引流推广?通过豆瓣每天轻松日引200精准客户