JyLie

vuePress-theme-reco JyLie    2017 - 2023
JyLie

Choose mode

  • dark
  • auto
  • light
主页
分类
  • API
  • HTML
  • css
  • vue
  • Linux
  • Docker
  • Webpack
  • WebGL
  • PixiJS
  • Github
  • BOM
  • XML
  • bug
  • ie
  • uniapp
  • IE
  • mysql
  • font
  • bom
  • canvas
  • video
  • html
  • JavaScript
  • js
  • 运算符
  • RegExp
  • 编码
  • MiniApp
  • nginx
  • Tool
  • node.js
  • cat
  • nodejs
  • protocol
  • URL
  • FLOW
  • DNS
  • Protocol
  • python
  • 安全
  • linux
  • shell
  • IDE
  • Packer
  • ViteJS
  • git
  • vendor
  • WebApp
  • WebView
  • Window API
  • webview
  • 规范
标签
时光轴
GitHub
author-avatar

JyLie

74

Article

79

Tag

主页
分类
  • API
  • HTML
  • css
  • vue
  • Linux
  • Docker
  • Webpack
  • WebGL
  • PixiJS
  • Github
  • BOM
  • XML
  • bug
  • ie
  • uniapp
  • IE
  • mysql
  • font
  • bom
  • canvas
  • video
  • html
  • JavaScript
  • js
  • 运算符
  • RegExp
  • 编码
  • MiniApp
  • nginx
  • Tool
  • node.js
  • cat
  • nodejs
  • protocol
  • URL
  • FLOW
  • DNS
  • Protocol
  • python
  • 安全
  • linux
  • shell
  • IDE
  • Packer
  • ViteJS
  • git
  • vendor
  • WebApp
  • WebView
  • Window API
  • webview
  • 规范
标签
时光轴
GitHub
  • 元素语言声明lang中zh-cmn-Hans、zh-cn、zh的区别

元素语言声明lang中zh-cmn-Hans、zh-cn、zh的区别

vuePress-theme-reco JyLie    2017 - 2023

元素语言声明lang中zh-cmn-Hans、zh-cn、zh的区别


JyLie 2018-03-30 HTML

# 前言

使用软件编辑器生成代码模板时,基本会自动在文件跟元素声明一个文档语言类型lang,那么在 HTML 根部声明"zh-cn"、lang="zh"、lang="zh-cmn-Hans"区别是什么呢?下面一起来看看吧。

# 元素语言类型分析

单一的 zh 和 zh-CN 均属于废弃用法。

问题主要在于,zh 现在不是语言 code 了,而是 macrolang,能作为语言 code 的是 cmn(国语)、yue(粤语)、wuu(吴语)等。通常建议写成 zh-cmn 而不是光写 cmn,主要是考虑兼容性(至少可匹配 zh),有不少软件和框架还没有据此更新。

zh-CN 的问题还在于,其实多数情况下标记的是简体中文,但是不恰当的使用了地区,这导致同样用简体中文的 zh-SG(新加坡)等无法匹配。更典型的是 zh-TW 和 zh-HK。所以其实应该使用 zh-Hans / zh-Hant 来表示简体和繁体。

那么完整的写法就是 zh-cmn-Hans,表示简体中文书写的普通话/国语。一般而言没有必要加地区代码,除非要表示地区特异性,一般是词汇不一样(比如维基百科的大陆简体和新马简体)。

# 元素语言类型标准

🌰 有了上述分析,那么 HTML 根部如何全局声明文档语言类型呢?

  • 简体中文页面:<html lang="zh-cmn-Hans">
  • 繁体中文页面:<html lang="zh-cmn-Hant">
  • 英语页面:<html lang="en">

除了在根元素声明文档语言类型,还可以局部元素标签上独立声明。因为需要加地区代码的情况比较少见,除非为了强调不同地区汉语使用差异,则在局部代码独立声明语言类型。

🌰 举个栗子:

<style>
  [lang='zh-cmn-Hans-CN']::after {
    content: '(中国大陆)';
    font-size: 10px;
  }
  [lang='zh-cmn-Hans-TW']::after {
    content: '(中国台湾)';
    font-size: 10px;
  }
  [lang='zh-cmn-Hans-SG']::after {
    content: '(新加坡)';
    font-size: 10px;
  }
</style>
<p lang="zh-cmn-Hans">
  <b lang="zh-cmn-Hans-CN">菠萝</b>
  和
  <b lang="zh-cmn-Hant-TW">?梨</b>
  其实是同一种水果。只是大陆和台湾称谓不同,且新马一带的称谓也是不同的,称之为
  <b lang="zh-cmn-Hans-SG">黄梨</b>
  。
</p>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

当然,由于历史原因,有时候不得不继续使用 zh-CN。比如中文维基百科,沿用了传统的 zh-CN/zh-HK/zh-SG/zh-TW(按照标准应该使用 zh-cmn-Hans-CN、zh-cmn-Hant-HK、zh-cmn-Hans-SG、zh-cmn-Hant-TW)。

这时候,合理的软件行为,是将 zh-CN 等转化为 zh-cmn-Hans(即转化为最常见的误用所对应的实际标准写法)。实际上,各相关标准,也存在一定的滞后。

例如 CSS 的:lang 选择器,不支持选择仅仅简体/繁体中文(而不管是 cmn 或是 yue 或是 min 等汉语方言)。理想情况是 CSS3 对:lang 选择器的语法进行升级,即 BCP 47 中的高级匹配算法,支持 :lang(*-Hans)这样的写法。

# 相关文献

  • MDN-lang