作 web 無障礙相關的研究時,遇到的第一件事就是要給 <html>
設置正確的 lang
屬性,這麼簡單的一件事,想也不用就寫好了:<html lang="zh-CN">
,或者直接簡寫成 <html lang="zh">
,Bingo,能夠去作其它事了。php
但仔細想想,好像有些問題html
zh
是什麼鬼?拼音?明明是國際標準怎麼會用中文拼音?CN
爲何要大寫?zh-CN
表示中國中文,zh-SG
表示新加坡中文,但都是用的簡體中文,貌似沒什麼區別?佢系一個須刨嚟嘅
(它是一個刮鬍刀),那屏幕閱讀器是用普通話朗讀仍是用粵語朗讀呢?爲了一探究竟,我決定開始瞭解下語言標記是如何定義的。git
先從 lang
屬性的定義開始,參考 MDN 上關於 lang 上的解釋,它是由 IETF 的 BCP47 規範來定義的, 根據 BCP47 規範的描述,它是 RFC5646 與 RFC4647 這兩個規範的最佳實踐合集,其中取代了 RFC4646、RFC3066、RFC1766 這三個舊的語言標籤規範,最新的規範定義了語言標籤的描述規則以下:github
language - extlang - script - region - variant - extension - privateuse
主語言 - 擴展語言(方言) - 書寫文字 - 區域 - 變體 - 擴展 - 私有
複製代碼
由子標籤按順序經過連字號(-)鏈接起來組成一個完整的語言標籤,各子標籤的格式遵循如下標準:web
這纔剛開始講,就遇到了一堆的專有名稱,一堆的國際規範,用一個字形象我如今的心情:懵bash
對新規範的解讀先停一下,咱們來先回過頭來從 zh-CN
的歷史開始講起ide
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
的由來,也是目前使用最廣泛的一種中文語言標籤。ui
2001年1月發佈的 RFC3066 語言標籤規範, 使用 ISO639-2 的3字母語言代碼,漢語使用 zho
表示,一樣來自「中文」的漢語拼音:Zhōngwén
的前3個字母。spa
2006年9月發佈 RFC4646 (規範的主體)與 RFC4647 (處理匹配行爲) 語言標籤規範。 RFC4646 增長了使用 ISO15924 的4字母書寫文字子標籤,簡體中文是 Hans
,繁體中文是 Hant
,以及 UNM.49 的3數字地理分區碼。3d
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
做爲主語言標籤,這樣能更好的向前兼容。
瞭解了語言標籤規範的發展歷史,咱們再回到 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
做爲擴展方言使用。
zh
中國字或中國話cdo
閩東語cjy
晉語cmn
普通話或國語cpx
莆仙語czh
徽語czo
閩中語gan
贛語hak
客家話hsn
湘語mnp
閩北語nan
閩南語wuu
吳語yue
粵語lzh
文言文Hans
簡體漢字Hant
繁體漢字CN
CHINA 中國HK
HONG KONG 香港TW
Taiwan 臺灣SG
Singapore 新加坡綜上所述,從 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
以繁體中文書寫的臺灣地區國語用詞I'm Gafish 原創文章,首發於 個人博客,內容若有錯誤,還望指正,謝謝您的閱讀。