網頁頭部的聲明應該是用 lang="zh" 還是 lang="zh-cn"?


把我在另一個回答里的評論整理一下搬運過來:

lang屬性的取值應該遵循 BCP 47 - Tags for Identifying Languages。

單一的 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,表示簡體中文書寫的普通話/國語。一般而言沒有必要加地區代碼,除非要表示地區特異性,一般是辭彙不一樣(比如維基百科的大陸簡體和新馬簡體)。

所以回答題主,兩種都不對。

如何標記的例子:

1. 簡體中文頁面:html lang=zh-cmn-Hans
2. 繁體中文頁面:html lang=zh-cmn-Hant
3. 英語頁面:html lang=en

4. 《回來》的音頻,以國語演唱:audio lang=zh-cmn
5. 《海闊天空》的音頻,以粵語演唱:audio lang=yue
6. 《進來白相相》的音頻,以滬語演唱:audio lang=wuu
注意上述因為都是音頻,所以不應加上 Hans/Hant 標記。

7. 《最終信仰》的音頻,雙語演唱,因此audio不需要標記lang(如果一定需要標記可以用 lang=mul),但是每個段落的歌詞可以分別用 p lang=en 和 p lang=zh-cmn 標記(根據簡體或是繁體可用 zh-cmn-Hans 或 zh-cmn-Hant)。
8. 《忐忑》的音頻,沒有歌詞,因此不需要標記lang(如果一定需要標記可用 audio lang=zxx)。

需要加地區代碼的情況一般比較少,除非為了強調不同地區漢語使用差異。比如:
&


&菠蘿&和&鳳梨&其實是同一種水果。只是大陸和台灣稱謂不同,且新馬一帶的稱謂也是不同的,稱之為&黃梨&。
&【參考菠蘿和鳳梨有區別嗎?】

當然,由於歷史原因,有時候不得不繼續使用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)這樣的寫法。

更新:Selectors Level 4 已經加入了對BCP 47高級匹配演算法的支持,即支持 :lang(*-Hans) 的寫法。(感謝 @一絲 君。)


zh 是中文,代表的是宏語言(Macrolanguage),zh 單獨用表示中文整體,可以是方言、文言文、簡繁體等混合內容,畢竟大陸地區大部分人都能認識不少繁體字,台灣地區大部分人也能認識很多簡體字。理論上 zh-CN 表示的是中國大陸中文,包含方言和簡繁體,但默認指簡體普通話,局限性就體現出來了,沒法表達繁體普通話,這時為了精準性,應該用獨立語種替換,包括但不僅限於普通話和七大方言:

cmn 普通話(官話、國語)
wuu 吳語(江浙話、上海話)、czh 徽語(徽州話、嚴州話、吳語-徽嚴片)
hak 客家語
yue 粵語(廣東話)
nan 閩南語(福建話、台語)、cpx 莆仙話(莆田話、興化語)、cdo 閩東語、mnp 閩北語、zco 閩中語
gan 贛語(江西話)
hsn 湘語(湖南話)
cjy 晉語(山西話、陝北話)

語言文字標籤書寫順序:

language-extlang-script-region-variant-extension-privateuse
語言文字種類-擴展語言文字種類-書寫格式-國家和地區-變體-擴展-私有

語言文字標籤示例:

language:
fr 法語
es 西班牙語

language-extlang 或 language:
zh-lzh 或 lzh 中文 (文言文)
sgn-csl 或 csl 手語 (中國大陸)

language-region:
zh-CN 中文 (簡體, 中國大陸)
en-US 英語 (美國)

language-script:
cmn-Hans 普通話 (簡體)
yue-Hant 粵語 (繁體)

language-script-region:
cmn-Hans-CN 普通話 (簡體, 中國大陸)
cmn-Hant-TW 普通話 (繁體, 台灣)

language-script-variant:
zh-Latn-pinyin 漢語拼音(例:nǐ,拉丁字母形式)
zh-Bopo-pinyin 注音拼音(例:ㄋ丨ˇ,羅馬字形式,中國大陸1958年以前使用,台灣目前使用)

附註:

  1. 以下所有 zh 開頭寫法已於 2009 年廢棄,不推薦使用,請直接去掉 zh- 前綴並使用 cmn、wuu、yue、gan 等 (上述標記已由 2005 年的 extlang 升級到 2009 年的 language,維基百科吳、粵、贛等語言版本均已使用最新的標準寫法) 代替即可:

    zh-Hans, zh-Hans-CN, zh-cmn, zh-cmn-Hans, zh-cmn-Hant, zh-wuu, zh-yue, zh-gan

    廢棄可能原因:在語言學的分類上,中國語言學者多認為吳語、粵語、閩語等是漢語的方言,而西方學者多認為這些語言是一門和漢語同級關係的單獨語種。

  2. 以下兩種寫法均正確,後者描述更精準,但目前瀏覽器和操作系統都只支持前者,使用新標準可能會造成無法匹配瀏覽器用戶定義字體、網頁翻譯、程序語言自動切換等功能,前端和碼農為了兼容性推薦使用前者:

    zh-CN 中文 (簡體, 中國大陸) 對應 cmn-Hans-CN 普通話 (簡體, 中國大陸)
    zh-SG 中文 (簡體, 新加坡) 對應 cmn-Hans-SG 普通話 (簡體, 新加坡)
    zh-HK 中文 (繁體, 香港) 對應 cmn-Hant-HK 普通話 (繁體, 香港)
    zh-MO 中文 (繁體, 澳門) 對應 cmn-Hant-MO 普通話 (繁體, 澳門)
    zh-TW 中文 (繁體, 台灣) 對應 cmn-Hant-TW 普通話 (繁體, 台灣)

  3. 同是簡體中文頁面, 默認或書面語均標記為 cmn 普通話,全文使用地方方言表達時,使用相應語言文字標籤標記,例:

    「你」 「我們」 用 cmn-Hans 普通話 (簡體)
    「儂」 「啊啦」 用 wuu-Hans 吳語 (簡體)
    「你」 「我哋」 用 yue-Hans 粵語 (簡體)

  4. 一般情況不用 region 選項,但如果要針對特定地區特定用語的友好性,則應設置區域,例 :

    「消息」 「黃梨」 「自行車」 用 cmn-Hans-SG 普通話 (簡體, 新加坡)
    「消息」 「菠蘿」 「自行車」 用 cmn-Hans-CN 普通話 (簡體, 中國大陸)
    「消息」 「菠蘿」 「自行車」 用 cmn-Hant-CN 普通話 (繁體, 中國大陸)
    「訊息」 「菠蘿」 「單車」 用 cmn-Hant-HK 普通話 (繁體, 香港)
    「訊息」 「鳳梨」 「腳踏車」 用 cmn-Hant-TW 普通話 (繁體, 台灣)

    「analyse」 「color」 「elevator」 用 en-US 英語 (美國)
    「analyze」 「colour」 「lift」 用 en-GB 英語 (英國)

    參考:

    1. W3C Language tags in HTML and XML
    2. IETF BCP 47 - Tags for Identifying Languages
    3. IANA Language Subtag Registry

    轉載請私信。


兩種寫法都可以,看你的需求選擇。參考 W3C: Language information and text direction:

Briefly, language codes consist of a primary code and a possibly empty series of subcodes:

language-code = primary-code ( "-" subcode )*

Here are some sample language codes:

  • "en": English
  • "en-US": the U.S. version of English.
  • "en-cockney": the Cockney version of English.
  • "i-navajo": the Navajo language spoken by some Native Americans.
  • "x-klingon": The primary tag "x" indicates an experimental language tag

「實際上它是一個刮鬍刀」——長文考證,結束此題。

既然是說網頁HTML,那就先找到HTML的制定組織,即W3C(http://w3.org)。
然後看官方文檔:
最新的HTML5的:3 Semantics, structure, and APIs of HTML documents
HTML 4.01的:Basic HTML data types

HTML5官方文檔節選:

The lang attribute (in no namespace) specifies the primary language for the element"s contents and for any of the element"s attributes that contain text. Its value must be a valid BCP 47 language tag, or the empty string. Setting the attribute to the empty string indicates that the primary language is unknown. [BCP47]

HTML 4.01官方文檔節選:

The value of attributes whose type is a language code ( %LanguageCode in the DTD) refers to a language code as specified by [RFC1766], section 2. For information on specifying language codes in HTML, please consult the section on language codes.

現在這個年代,討論HTML5即可,那就看看「BCP 47」是什麼。W3C官方有講解:Choosing a language tag,這篇文章詳細的講解了如何選擇語文代碼,仔細讀一遍,此問題即有了答案。
節選如下:

Language tag syntax is defined by the IETF"s BCP 47. In the past it was necessary to consult lists of codes in various ISO standards to find the right subtags, but now you only need to look in the IANA Language Subtag Registry. We will describe the new registry below.

BCP stands for "Best Current Practice", and is a persistent name for a series of RFCs whose numbers change as they are updated. The latest RFC describing language tag syntax is RFC 5646, Tags for the Identification of Languages, and it obsoletes the older RFCs 46463066 and 1766.

翻譯大意就是:
語言文字代碼按照「BCP 47」執行。過去需要查看很多ISO文檔,拼起來代碼,現在省事了,直接看IANA整理出來的即可。
BCP是「最佳實踐」的意思,是由一系列會更新的RFC文檔組成。「BCP 47」即「第47號最佳實踐」規定了語言文字代碼,目前最新文檔為RFC 5646,取代4646、3066和1766。
可以看到這解決了HTML 4.01中寫死RFC 1766導致無法更新的問題。

然後文中詳細的講解了langtag如何拼接,和BCP 47文檔中一樣,格式為:

langtag = language
["-" script]
["-" region]
*("-" variant)
*("-" extension)
["-" privateuse]

language = 2*3ALPHA ; shortest ISO 639 code
["-" extlang] ; sometimes followed by
; extended language subtags
/ 4ALPHA ; or reserved for future use
/ 5*8ALPHA ; or registered language subtag

extlang = 3ALPHA ; selected ISO 639 codes
*2("-" 3ALPHA) ; permanently reserved

script = 4ALPHA ; ISO 15924 code

region = 2ALPHA ; ISO 3166-1 code
/ 3DIGIT ; UN M.49 code

variant = 5*8alphanum ; registered variants
/ (DIGIT 3alphanum)

簡單的說就是:
1:語種,到IANA文檔中搜「Type: language」,還可能包含extlang擴展語種,到IANA文檔中搜「Type: extlang」。此項一般不可省略,出現1次。
2:書寫格式,到IANA文檔中搜「Type: script」。此項可省略,出現0或1次。
3:區域,到IANA文檔中搜「Type: region」。此項可省略,出現0或1次。
4:聲音變種(方言)或文字變種。此項可省略,出現0或多次。
等等。

打開IANA的文檔:http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry

搜索結果如下:

%%
Type: language
Subtag: zh
Description: Chinese
Added: 2005-10-16
Scope: macrolanguage
%%
Type: language
Subtag: cmn
Description: Mandarin Chinese
Added: 2009-07-29
Macrolanguage: zh
%%
Type: language
Subtag: yue
Description: Yue Chinese
Description: Cantonese
Added: 2009-07-29
Macrolanguage: zh
%%
Type: language
Subtag: nan
Description: Min Nan Chinese
Added: 2009-07-29
Macrolanguage: zh
%%
Type: language
Subtag: lzh
Description: Literary Chinese
Added: 2009-07-29
Macrolanguage: zh

%%
Type: extlang
Subtag: cmn
Description: Mandarin Chinese
Added: 2009-07-29
Preferred-Value: cmn
Prefix: zh
Macrolanguage: zh
%%
Type: extlang
Subtag: yue
Description: Yue Chinese
Description: Cantonese
Added: 2009-07-29
Preferred-Value: yue
Prefix: zh
Macrolanguage: zh

%%
Type: script
Subtag: Hans
Description: Han (Simplified variant)
Added: 2005-10-16
%%
Type: script
Subtag: Hant
Description: Han (Traditional variant)
Added: 2005-10-16
%%
Type: script
Subtag: Latn
Description: Latin
Added: 2005-10-16

%%
Type: region
Subtag: CN
Description: China
Added: 2005-10-16
%%
Type: region
Subtag: HK
Description: Hong Kong
Added: 2005-10-16
%%
Type: region
Subtag: TW
Description: Taiwan, Province of China
Added: 2005-10-16

%%
Type: redundant
Tag: zh-Hans-TW
Description: Taiwan Chinese in simplified script
Added: 2005-04-11

%%
Type: redundant
Tag: zh-cmn-Hans
Description: Mandarin Chinese (Simplified)
Added: 2005-07-15
Deprecated: 2009-07-29
Preferred-Value: cmn-Hans
%%
Type: redundant
Tag: zh-cmn-Hant
Description: Mandarin Chinese (Traditional)
Added: 2005-07-15
Deprecated: 2009-07-29
Preferred-Value: cmn-Hant
%%
Type: redundant
Tag: zh-wuu
Description: Shanghaiese or Wu
Added: 1999-12-18
Deprecated: 2009-07-29
Preferred-Value: wuu
%%
Type: redundant
Tag: zh-yue
Description: Cantonese
Added: 1999-12-18
Deprecated: 2009-07-29
Preferred-Value: yue

可以發現zh、cmn、yue、nan是平級的,都是language,都可以作為第1位代碼。那zh又作為macrolanguage是什麼意思?
ISO的解釋如下:ISO 639 macrolanguage
在2007年的國際標準 ISO 639-3中,認定漢語文(zh)是一個大語文(macrolanguage),包含13種語文,cdo – 閩東語,cjy – 晉語,cmn – 北方話,cpx – 莆仙語,czh – 徽語,czo – 閩中語,gan – 贛語,hak – 客家話,hsn – 湘語,mnp – 閩北語,nan – 閩南語,wuu – 吳語,yue – 粵語。
BCP 47的解釋如下:BCP 47 - Tags for Identifying Languages

For example, the macro language Chinese ("zh") encompasses a number of languages. For compatibility reasons, each of these languages has both a primary and extended language subtag in the registry. A few selected examples of these include Gan Chinese ("gan"), Cantonese Chinese ("yue"), and Mandarin Chinese ("cmn"). Each is encompassed by the macro language "zh" (Chinese). Therefore, they each have the prefix "zh" in their registry records. Thus, Gan Chinese is represented with tags beginning "zh-gan" or "gan", Cantonese with tags beginning either "yue" or "zh-yue", and Mandarin Chinese with "zh-cmn" or "cmn". The language subtag "zh" can still be used without an extended language subtag to label a resource as some unspecified variety of Chinese, while the primary language subtag ("gan", "yue", "cmn") is preferred to using the extended language form ("zh-gan", "zh-yue", "zh-cmn").

W3C解釋如下:Choosing a language tag

As we recommended for the collection subtags mentioned above, in most cases you should try to use the more specific subtags, but there are a small number of important exceptions. These are situations where you should continue using a macrolanguage subtag for reasons of backward compatibility.

For example, although BCP 47 explains that zh (the macrolanguage subtag for Chinese) doesn"t actually specify which of the many, sometimes mutually unintelligible, dialects of Chinese is actually meant by this subtag, in practice convention overwhelmingly associates the macrolanguage subtag with the predominant language among the encompassed subtags - in this case, cmn (Mandarin Chinese). If your application identified Mandarin Chinese in the past using the language tag zh-CN (Chinese as used in Mainland China), or even just zh, you can continue to use zh in this way. Using cmn or cmn-CN may cause serious compatibility problems if the software or users expect a tag such as zh.

If, on the other hand, you are using zh to refer to another Chinese dialect such as Hakka, you should use the language subtag hak instead.

大意就是:推薦使用language(具體語種,比如cmn、yue),而不是macrolanguage(大語種),如果是為了兼容老設備,才使用macrolanguage(比如zh-cmn、zh-yue)。

從IANA的文檔中還能發現,「zh-Hant」、「zh-yue」和「zh-cmn-Hans」都是「Deprecated」,是不讓用了嗎?
再仔細一看提示「Type: redundant」,查查這是什麼意思,BCP 47解釋如下:

Many of these registered tags were made redundant by the advent of either RFC 4646 or this document. A redundant tag is a grandfathered registration whose individual subtags appear with the same semantic meaning in the registry. For example, the tag "zh-Hant" (Traditional Chinese) can now be composed from the subtags "zh" (Chinese) and "Hant" (Han script traditional variant). These redundant tags are maintained in the registry as records of type "redundant", mostly as a matter of historical curiosity.

大意是:「zh」和「Hant」已經被收錄了,拼起來就是「zh-Hant」,所以重複了,不應該作為單獨條目收錄了,所以廢棄了。而拼起來的「zh-Hant」正常使用。 @獵奇怪蜀黍

回到提主的問題:網頁應該用「zh」還是「zh-cn」?
答:都不推薦,二選一的話那「zh-cn」好點,因為zh表示的範圍太大了。
原因:
1、不推薦使用zh,而推薦使用cmn、yue。
2、如果前面用精確了,一般用不到CN這種區域代碼

為什麼不推薦使用zh-CN?
請看下面例子:
「佢系一個須刨嚟嘅」 是漢字,和「它是一個刮鬍刀」一起用「zh-CN」表示,有幾個人理解?明明是相互隔離的兩個語種,用同一種代碼表示,顯然不合理。

推薦這些:
文字代碼:
cmn-Hans:普通話用規範漢字寫下來,比如「它是一個刮鬍刀」,為兼容時,可使用「zh-cmn-Hans」。
yue-Hans:粵語用規範漢字寫下來,比如「佢系一個須刨嚟嘅」,沒必要為兼容而使用「zh-yue-Hans」,因為看得懂「zh-CN」的人,看不懂這些字。
yue-Hant:粵語用國字寫下來,比如「佢係一個鬚刨嚟嘅」。
lzh-Hans:文言文用規範漢字寫下來,比如「驢不勝怒,蹄之」。
lzh-Hant:文言文用國字寫下來,比如「驢不勝怒,蹄之」。

聲音(語言)代碼:
cmn:普通話或國語
cmn-CN:普通話
cmn-TW:國語
yue:粵語,比如粵語歌曲、電影的粵語音軌

另附我的一篇文章:《語言和文字的區別》
很多人沒有理清楚一個基本概念:「語言」和「文字」是不同的東西。
想想小學「語文」課本,而不是「語言」課本,為什麼?
因為「語言」是指發音,「文字」是單獨的事物。
看看法律,就明白了:
《中華人民共和國國家通用語言文字法》第二條:本法所稱的國家通用語言文字是普通話和規範漢字。
《中華人民共和國憲法》第一百二十一條:民族自治地方的自治機關在執行職務的時候,依照本民族自治地方自治條例的規定,使用當地通用的一種或者幾種語言文字。
《中華人民共和國香港特別行政區基本法》第九條:香港特別行政區的行政機關、立法機關和司法機關,除使用中文外,還可使用英文,英文也是正式語文。
台灣:《常用國字標準字體表》、《次常用國字標準字體表》與《罕用字體表》 《語言文字基本法》等。

而大學課本就不嚴謹了,「C語言編程」是錯誤的,應該叫「C文字編程」,其發音是「英語」,不存在單獨的「C發音」。

所以「language」是「語文」的意思,英文代碼也要分兩種:語言代碼 和 文字代碼,即language tags分為:spoken language tags 和 written language tags。

常見語言:
普通話
粵語
英語

常見文字:
規範漢字(大陸法律規定如此,香港法律規定為「中文」)
國字(台灣法律規定如此)
英文

大部分網站是純文字的,所以只牽扯到文字代碼。
而現在各種形態都出現了,聲音代碼也需要理清楚。比如:
電影(VCD/DVD年代就有這個問題了):聲音有「普通話」、「粵語」等多種,字幕也有「規範漢字」、「英文」等多種。
遊戲:比如星際爭霸2的劇情任務,配音有多種,字幕和界面也有多種。
豆瓣電台:文字是「規範漢字」,聲音有多種。

不過很遺憾,程序員很少有能把語言和文字分清楚的,做出來的程序凶神惡煞……
如圖:「中文」這種「聲音」……俺真沒聽過……


目前,最新的語言標籤標記法的國際標準是IETF的BCP 47(Best Current Practice),也就是RFC 5646取代了之前的RFC 4646,3066和1766.

RFC 5646和之前版本的區別:

  • 所有子標籤都在IANA registry查詢。
  • 所有子標籤有固定的位置和長度。
  • 描述更具靈活性。

RFC 5646規定語言標籤按以下形式排列:

language-extlang-script-region-variant-extension-privateuse

所有語言標籤都是大小寫無關的,但是依照慣例 language 標籤小寫,region 標籤大寫,script 標籤首字大寫。

所有標籤都可以在 IANA registry 查詢,獲取更多信息可以閱讀Choosing a language tag。

以下鏈接包含更多的介紹:

  • Language tags in HTML and XML
  • 語種名稱代碼——阮一峰

如果仔細看語言tag(bcp47)的BNF語法定義,其實@李蕭 與 @管斌瑞 的回答才是靠譜的!
bcp47中語言tag的BNF語法定義在的第三、四頁:

Language-Tag = langtag ; normal language tags
/ privateuse ; private use tag
/ grandfathered ; grandfathered tags

規範的語言tag必須是符合3種情況其中的一種。第二種的私有定義我們就不討論了,而第三種為了兼容和過渡,比如zh-xiang,為什麼說zh-xiang特例,後面會說到。

我們只關注第一種情況:看看langtag的定義:

langtag = language
["-" script]
["-" region]
*("-" variant)
*("-" extension)
["-" privateuse]

language = 2*3ALPHA ; shortest ISO 639 code
["-" extlang] ; sometimes followed by
; extended language subtags
/ 4ALPHA ; or reserved for future use
/ 5*8ALPHA ; or registered language subtag

extlang = 3ALPHA ; selected ISO 639 codes
*2("-" 3ALPHA) ; permanently reserved

script = 4ALPHA ; ISO 15924 code

region = 2ALPHA ; ISO 3166-1 code
/ 3DIGIT ; UN M.49 code

variant = 5*8alphanum ; registered variants
/ (DIGIT 3alphanum)

extension = singleton 1*("-" (2*8alphanum))

「 langtag」定義中很明確:「language」是必須的,後面「script」,「region」,「variant」都為可選,且必須使用-分隔,「varient」可以出現0次或無數次,而「script」等只能出現0或1次。

這個最重要的「language」的定義有三種情況:使用最短ISO 639代碼2個或3個字元(注意這個最短!!)加可選的「extlang」(3個字元長度的ISO 639-3代碼)。language必須優先考慮ISO 639-1中的代碼,如果沒有則選擇639-2中三位的,如果有extlang,那extlang必須使用ISO 639-3中的代碼和擴展預留。

另外兩種「language」的定義,一個是必須4個字元長度保留,另一個是5到8個字元的subtag。subtag其實就是一個符合language的定義,因為extlang的擴展可以出現0到2次,所以subtag的字元長度可能是5-8之間。

這裡稍微岔開一下說說ISO639的問題,ISO639規範下有6個部分,639-1是2字元編碼,639-2是3字元編碼,相對ISO639 -1來說另一種表示方法,他們都是屬於ISO639的一部分,不存在新舊替換的問題。用途不一,就比如說ISO 639-2存在兩種編碼,B類用於書籍著作等,T類則用於技術。接下來就是639-3,其實是ISO639-2的超集。剩下的4、5、6都是實現指導和族的分類編碼等,干其他用的,和bcf47沒太大關係。

關於 @賀師俊 的回答中,他回答的重點不在bcf47上,而是在說ISO 639。我覺得他錯誤理解ISO639的幾個組成部分之間的關係。準確說各部各有用處,沒有新舊替換的概念!zh和zho在639-3中分類屬於宏語言(macrolanguage,其實就像香蕉、蘋果都叫水果一樣,水果就屬於macro)而yue,cmn則是獨立語言(individual)。非bcf47的用途上說,他的用法沒錯。但在bcp47中,他的說法則不符合shortest ISO 639 code這一要求。所以"language"定義的要優先考慮ISO639-1的編碼,如果不存在則使用ISO639-2T。需要extlang,則從ISO639-3中individual選取,因為macrolanguage的編碼在639-1和639-2中已經有了。因此zh,zh-yue, ar,ar-arb都是符合規範的「language」定義的。

所以說「zh-xiang」並不符合「 language」的語義定義,它定義於「 grandfathered」中為了兼容和過度。

接著「language」後都是可選的,但必須保證先後次序!「script」是描述使用「腳本」,按我意思理解就是使用那種文字表述方式,這個值必須使用ISO 15924 的編碼,4個字元長度。獲取ios系統的語言環境就可以見到這種language+script方式。比如簡體中文就是zh-Hans,繁體中文就是zh-Hant

我們如果是在ios中獲取locale信息,返回的就是language+script+region,region的定義使用ISO 3166-1 的2個大寫字元編碼或者UN M.49 三位數字編碼。比如US,TW,CN。當然我們如果不用script那就是我們最最常見的了:zh-TW,zh-CN,en-US,en-GB。基本大部分操作系統和瀏覽器依然沿用這種language+region的方式。其實形式是非常符合規範的,沒有聽說要替換!剩下就是可以出現0次或n次的和變體和擴展,這個除非你針對非常專業語言分類才用得上。對於技術上說,網頁和操作系統,基本也就是language+script+region就足夠了!

接下來回答題主的問題,究竟用zh,還是zh-CN。我的意見是語言聲明寫不寫用處不大,你要關心的是你採用的什麼字符集而已,如果是utf8編碼,你頁面就是寫泰語、日語、韓語和漢語,照樣都能顯示!除非你用的特殊字體,訪問者電腦上沒這些字體。

如果你是想做網站的自動多國語言支持,瀏覽器請求頭中Accept-Language中告訴你用戶正在使用哪種語言,你就可以根據請求中的語言標記來安排伺服器返回什麼語言的內容給他。

linxuwindowsmac的應用程序實現的自動多過語言支持也是這樣,去訪問系統或提供給你的locale信息,這個信息都是符合bcp47的。開發程序時,就不要文字內容寫帶代碼中,而是提供語言包,程序根據獲取到的當前的locale信息去判斷應該使用那個語言包。只不過有些系統提供的是language+region,如linux,android等。有些是用language+script+region如蘋果的系統。


樓上的講了一群廢話,說來說去也沒說清楚個啥。


&

應該是 zh-cn 的,對於目前在互聯網使用的中文一般有三種:

簡體中文(中國) zh-cn
繁體中文(台灣地區) zh-tw
繁體中文(香港) zh-hk


目前,語言的標籤表示法的國際標準是RFC 4646,名稱是《Tags for Identifying Languages》。
簡單說,這個文件規定,一種語言的標籤應該按照如下方式排列:

language-script-region-variant-extension-privateuse
1. language:這部分就是ISO 639規定的代碼,比如中文是zh。
2. script:表示變體,比如簡體漢字是zh-Hans,繁體漢字是zh-Hant。
3. region:表示語言使用的地理區域,比如zh-Hans-CN就是中國大陸使用的簡體中文。
4. variant:表示方言。
5. extension-privateus:表示擴展用途和私有標識。
一般約定,language標籤全部小寫,region標籤全部大寫,script標籤只有首字母大寫。不同標籤之間用連字號-鏈接。

下面列出一些與中文有關的語言標籤。

zh-Hans 簡體中文
zh-Hans-CN 大陸地區使用的簡體中文
zh-Hans-HK 香港地區使用的簡體中文
zh-Hans-MO 澳門使用的簡體中文
zh-Hans-SG 新加坡使用的簡體中文
zh-Hans-TW 台灣使用的簡體中文
zh-Hant 繁體中文
zh-Hant-CN 大陸地區使用的繁體中文
zh-Hant-HK 香港地區使用的繁體中文
zh-Hant-MO 澳門使用的繁體中文
zh-Hant-SG 新加坡使用的繁體中文
zh-Hant-TW 台灣使用的繁體中文

此外,還有一些目前仍在使用,但因不符合規範,將被逐步替代(grandfathered)的標籤。

zh-hakka 客家話
zh-cmn 普通話
zh-cmn-Hans 簡體普通話
zh-cmn-Hant 繁體普通話
zh-gan 江西話
zh-guoyu 國語
zh-min 福建話
zh-min-nan 閩南話
zh-wuu 吳語(上海話)
zh-xiang 湖南話
zh-yue 粵語

【參考】:語種名稱代碼


雖然各位說了很多....

先抬頭看下

比如 知乎當前這個頁面用的是"lang=zh-CN" =.=


看完也沒明白到底哪種是最標準的,也是醉了!!


前排大佬們回答得真實多啊,各種引用,還是最底下的回答靠譜

逼乎就是逼乎


就上面對漢語的劃分,個人有點看法。
把粵語、客家話等列為漢語方言的各語種,提高到和漢語等同地位其實是混淆了漢語和普通話。
所謂語言(個人認為更應該成為語種),應該是文和言的組合。「文」就是書寫、記載所使用的字;「言」就是發音,怎麼說出來。事實上根本不存在漢語單獨一個語言,漢語,究其本意就是漢族使用的語言。粵語、客家話、贛語等等都是漢族人使用的語言,就是漢語的一個組成部分。所以漢語更應該是屬於一個宏語種(macrolang)。就像通常所說的英語。
事實上,造成這種誤解,主要就是把普通話簡單的等同於漢語了,其實大家都明白,普通話實際上就是在北京地方發音的基礎上配合簡體漢字制定出來的一種語言方案,說到底,普通話和粵語、長沙話、客家話等等一樣都是漢語在流通過程中,隨著歷史的變遷,逐漸形成了各有特色的「方言」。準確的說,不應該叫「方言」,尤其粵語,因為在粵語中使用的部分字和普通話中使用的字都有所差異,而且就使用的廣泛性,都已經超出了普通方言的範疇。就和普通話一樣,只不過,普通話是以國家的名義的推廣,減少民族間的交流阻礙,建立一種統一的語言環境。而粵語、客家話等則是隨著使用人群的自然流動,自發的傳播開的,就其使用的範圍來說,說是「方言」都有點名不符實了。


在贊同最多 @賀師俊 的回答中有一句 「單一的 zh 和 zh-CN 均屬於廢棄用法。」我不知道是出處何在,但是我覺得是不妥當的會誤導很多人,zh,zh-cn,cmn是適合不同場合用的,關於題主的問題,如果是在網頁中推薦zh,因為閱讀的人只要是中國人實際是無所謂什麼漢字的,當然你的網站有特別要求除外


參照 google,這個是簡體版


一群殺筆,簡體繁體都用zh表示 w3c的標準html5文檔里寫得清清楚楚 寫那麼多廢話 突顯自己專業 以為寫論文???


w3c官網是這樣說的:


看了半天,我想說查看當前網頁的源代碼 lang="zh-CN"


ISO 639-1 Language Codes

ISO 639-1 defines abbreviations for languages.

In HTML and XHTML they can be used in the lang and xml:lang attributes.

See also: next reference for country codes.

http://www.w3schools.com/tags/ref_language_codes.asp


好奇怪 而且很不理解 簡體字的頁面如果用zh-cmn-Hant-HK的話是不是就變成繁體字了?


HTML 語言代碼參考手冊

搞不懂各位大神在說些什麼


值 涵義

  1. zh-cmn 普通話
  2. zh-cmn-Hant
  3. 普通話(繁體)
  4. zh-cmn-Hans 普通話(簡體)
  5. zh-cmn-Hant-HK 普通話(繁體,香港地區)
  6. zh-cmn-Hans-CN 普通話(簡體,中國大陸)
  7. zh-gan 贛語
  8. zh-hak 客家話
  9. zh-yue 粵語
  10. zh-hsn 長沙話
  11. zh-yue-Hant-HK 粵語(繁體,香港地區)

摘錄源:Understanding the New Language Tags
不會英語,只會谷歌翻譯。。歡迎勘誤


推薦《HTTP權威指南》


推薦閱讀:

有哪些分享圖標資源的網站?
本科生如何系統地學習前端開發?
想要從零學起前端技術,有哪些靠譜的培訓學校?

TAG:網頁設計 | 前端開發 |