ISO 639-1 两位语言代码速查表|含中文 & 多国高频对照

thbcm阅读(426)

【最新·零基础速查】ISO 639-1 两位语言代码大全
——由编程狮(w3cschool.cn)整理,直接复制就能用!

一句话看懂

lang 属性、hreflang、SEO 多语言标签,都要写 小写两字母代码,例如中文写 zh,英文写 en。中文大类用 zh,想区分大陆 / 香港 / 台湾,就要在 zh 后面加上区域子标签(IETF BCP 47 标准)。

中文大类官方写法公式

language-extlang-script-region
  │        │      │      │
  │        │      │      └─ 两位区域码(CN / HK / TW / SG / MO)
  │        │      └─────── 书写体系(Hans 简体 / Hant 繁体)
  │        └──────────── 扩展语言(很少用)
  └────────────────── 语言主码(zh)

下文附完整对照表 + 常见坑位提醒。

一、为什么必须用小写?

规范来源 要求 写错后果
HTML Living Standard 2025 必须小写 浏览器虽容错,但百度 SEO 降权
Google/Bing 白皮书 强制小写 多语言站点收录异常
W3C i18n 指南 推荐小写 与框架 / CDN 缓存不一致

二、最常用 15 国语言代码(背下来)

语言 代码 示例代码片段
中文(简体) zh <html lang="zh-CN">
英语 en <html lang="en">
日语 ja <meta name="description" lang="ja" content="...">
韩语 ko <link rel="alternate" hreflang="ko" href="...">
法语 fr <p lang="fr">Bonjour</p>
德语 de <span lang="de">Hallo</span>
西班牙语 es <a href="/es/" hreflang="es">Español</a>
俄语 ru <title lang="ru">...</title>
葡萄牙语 pt <html lang="pt-BR">
意大利语 it <div lang="it">Ciao</div>
阿拉伯语 ar <html dir="rtl" lang="ar">
印地语 hi <p lang="hi">नमस्ते</p>
泰语 th <span lang="th">สวัสดี</span>
越南语 vi <html lang="vi">
印尼语 id <link rel="alternate" hreflang="id" href="...">

三、完整对照表(按语言名排序,复制即用)

代码 语言(中文) 语言(英文) 语言(自称)
aa 阿法尔语 Afar Afaraf
ab 阿布哈兹语 Abkhaz аҧсуа бызшәа
ae 阿维斯陀语 Avestan avesta
af 南非荷兰语 Afrikaans Afrikaans
ak 阿坎语 Akan Akan
am 阿姆哈拉语 Amharic አማርኛ
an 阿拉贡语 Aragonese aragonés
ar 阿拉伯语 Arabic اللغة العربية
as 阿萨姆语 Assamese অসমীয়া
av 阿瓦尔语 Avaric авар мацӀ
ay 艾马拉语 Aymara aymar aru
az 阿塞拜疆语 Azerbaijani azərbaycan dili
ba 巴什基尔语 Bashkir башҡорт теле
be 白俄罗斯语 Belarusian беларуская мова
bg 保加利亚语 Bulgarian български език
bh 比哈尔语 Bihari भोजपुरी
bi 比斯拉马语 Bislama Bislama
bm 班巴拉语 Bambara bamanankan
bn 孟加拉语 Bengali বাংলা
bo 藏语 Tibetan བོད་ཡིག
br 布列塔尼语 Breton brezhoneg
bs 波斯尼亚语 Bosnian bosanski jezik
ca 加泰罗尼亚语 Catalan Català
ce 车臣语 Chechen нохчийн мотт
ch 查莫罗语 Chamorro Chamoru
co 科西嘉语 Corsican corsu
cr 克里语 Cree ᓀᐦᐃᔭᐍᐏᐣ
cs 捷克语 Czech čeština
cu 古教会斯拉夫语 Old Church Slavonic ѩзыкъ словѣньскъ
cv 楚瓦什语 Chuvash чӑваш чӗлхи
cy 威尔士语 Welsh Cymraeg
da 丹麦语 Danish dansk
de 德语 German Deutsch
dv 迪维希语 Divehi Dhivehi
dz 不丹宗卡语 Dzongkha རྫོང་ཁ
ee 埃维语 Ewe Eʋegbe
el 现代希腊语 Greek Ελληνικά
en 英语 English English
eo 世界语 Esperanto Esperanto
es 西班牙语 Spanish Español
et 爱沙尼亚语 Estonian eesti
eu 巴斯克语 Basque euskara
fa 波斯语 Persian فارسی
ff 富拉语 Fula Fulfulde
fi 芬兰语 Finnish suomi
fj 斐济语 Fijian Vakaviti
fo 法罗语 Faroese føroyskt
fr 法语 French Français
fy 西弗里西亚语 Western Frisian Frysk
ga 爱尔兰语 Irish Gaeilge
gd 苏格兰盖尔语 Scots Gaelic Gàidhlig
gl 加利西亚语 Galician galego
gn 瓜拉尼语 Guarani avañe’ẽ
gu 古吉拉特语 Gujarati ગુજરાતી
gv 马恩岛语 Manx Gaelg
ha 豪萨语 Hausa هَوُسَ
he 希伯来语 Hebrew עברית
hi 印地语 Hindi हिन्दी
ho 希里莫图语 Hiri Motu Hiri Motu
hr 克罗地亚语 Croatian Hrvatski
ht 海地克里奥尔语 Haitian Kreyòl ayisyen
hu 匈牙利语 Hungarian magyar
hy 亚美尼亚语 Armenian Հայերեն
hz 赫雷罗语 Herero Otjiherero
ia 国际语 A Interlingua Interlingua
id 印尼语 Indonesian Bahasa Indonesia
ie 国际语 E Interlingue Interlingue
ig 伊博语 Igbo Asụsụ Igbo
ii 彝语(四川) Nuosu ꆈꌠꉙ
ik 依努皮克语 Inupiaq Iñupiaq
io 伊多语 Ido Ido
is 冰岛语 Icelandic Íslenska
it 意大利语 Italian Italiano
iu 因纽特语 Inuktitut ᐃᓄᒃᑎᑐᑦ
ja 日语 Japanese 日本語
jv 爪哇语 Javanese basa Jawa
ka 格鲁吉亚语 Georgian ქართული
kg 刚果语 Kongo Kikongo
ki 基库尤语 Kikuyu Gĩkũyũ
kj 宽亚玛语 Kwanyama Kuanyama
kk 哈萨克语 Kazakh қазақ тілі
kl 格陵兰语 Kalaallisut kalaallisut
km 高棉语 Khmer ខេមរភាសា
kn 卡纳达语 Kannada ಕನ್ನಡ
ko 韩语 Korean 한국어
kr 卡努里语 Kanuri Kanuri
ks 克什米尔语 Kashmiri कश्मीरी / كشميري
ku 库尔德语 Kurdish Kurdî
kv 科米语 Komi коми кыв
kw 康沃尔语 Cornish Kernewek
ky 吉尔吉斯语 Kyrgyz Кыргызча
la 拉丁语 Latin latine
lb 卢森堡语 Luxembourgish Lëtzebuergesch
lg 卢干达语 Ganda Luganda
li 林堡语 Limburgish Limburgs
ln 林加拉语 Lingala Lingála
lo 老挝语 Lao ພາສາລາວ
lt 立陶宛语 Lithuanian lietuvių kalba
lu 卢巴-卡坦加语 Luba-Katanga Tshiluba
lv 拉脱维亚语 Latvian latviešu valoda
mg 马达加斯加语 Malagasy fiteny malagasy
mh 马绍尔语 Marshallese Kajin M̧ajeļ
mi 毛利语 Māori te reo Māori
mk 马其顿语 Macedonian македонски јазик
ml 马拉雅拉姆语 Malayalam മലയാളം
mn 蒙古语 Mongolian Монгол хэл
mr 马拉地语 Marathi मराठी
ms 马来语 Malay Bahasa Malaysia
mt 马耳他语 Maltese Malti
my 缅甸语 Burmese ဗမာစာ
na 瑙鲁语 Nauru Ekakairũ Naoero
nb 书面挪威语 Norwegian Bokmål Norsk bokmål
nd 北恩德贝莱语 Northern Ndebele isiNdebele
ne 尼泊尔语 Nepali नेपाली
ng 恩敦加语 Ndonga Owambo
nl 荷兰语 Dutch Nederlands
nn 新挪威语 Norwegian Nynorsk Norsk nynorsk
no 挪威语 Norwegian Norsk
nr 南恩德贝莱语 Southern Ndebele isiNdebele
nv 纳瓦霍语 Navajo Diné bizaad
ny 尼扬贾语 Chichewa chiCheŵa
oc 奥克语 Occitan occitan
oj 奥吉布瓦语 Ojibwe ᐊᓂᔑᓈᐯᒧᐎᓐ
om 奥罗莫语 Oromo Afaan Oromoo
or 奥迪亚语 Oriya ଓଡ଼ିଆ
os 奥塞梯语 Ossetian ирон æвзаг
pa 旁遮普语 Panjabi ਪੰਜਾਬੀ / پنجابی
pi 巴利语 Pāli पाऴि
pl 波兰语 Polish Polski
ps 普什图语 Pashto پښتو
pt 葡萄牙语 Portuguese Português
qu 克丘亚语 Quechua Runa Simi
rm 罗曼什语 Romansh rumantsch grischun
rn 基隆迪语 Kirundi Ikirundi
ro 罗马尼亚语 Romanian Română
ru 俄语 Russian Русский
rw 基尼阿旺达语 Kinyarwanda Ikinyarwanda
sa 梵语 Sanskrit संस्कृतम्
sc 撒丁语 Sardinian sardu
sd 信德语 Sindhi सिन्धी
se 北萨米语 Northern Sami Davvisámegiella
sg 桑戈语 Sango yângâ tî sängö
si 僧伽罗语 Sinhala සිංහල
sk 斯洛伐克语 Slovak slovenčina
sl 斯洛文尼亚语 Slovenian slovenščina
sn 绍纳语 Shona chiShona
so 索马里语 Somali Soomaaliga
sq 阿尔巴尼亚语 Albanian Shqip
sr 塞尔维亚语 Serbian српски језик
ss 斯威士语 Swati SiSwati
st 塞索托语 Southern Sotho Sesotho
su 巽他语 Sundanese Basa Sunda
sv 瑞典语 Swedish Svenska
sw 斯瓦希里语 Swahili Kiswahili
ta 泰米尔语 Tamil தமிழ்
te 泰卢固语 Telugu తెలుగు
tg 塔吉克语 Tajik тоҷикӣ
th 泰语 Thai ไทย
ti 提格里尼亚语 Tigrinya ትግርኛ
tk 土库曼语 Turkmen Türkmençe
tl 他加禄语 Tagalog Wikang Tagalog
tn 茨瓦纳语 Tswana Setswana
to 汤加语 Tonga faka Tonga
tr 土耳其语 Turkish Türkçe
ts 宗加语 Tsonga Xitsonga
tt 塔塔尔语 Tatar татар теле
tw 特威语 Twi Twi
ty 塔希提语 Tahitian Reo Tahiti
ug 维吾尔语 Uyghur ئۇيغۇرچە
uk 乌克兰语 Ukrainian Українська
ur 乌尔都语 Urdu اردو
uz 乌兹别克语 Uzbek Oʻzbek
ve 文达语 Venda Tshivenḓa
vi 越南语 Vietnamese Tiếng Việt
vo 沃拉普克语 Volapük Volapük
wa 瓦隆语 Walloon walon
wo 沃洛夫语 Wolof Wolof
xh 科萨语 Xhosa isiXhosa
yi 依地语 Yiddish ייִדיש
yo 约鲁巴语 Yoruba Yorùbá
za 壮语 Zhuang Saw cuengh
zh 汉语 Chinese 中文
zu 祖鲁语 Zulu isiZulu

已弃用代码

ji / in / iw 已被 yiidhe 取代;
bh(Bihari) 已弃用但仍存在,bh 在 ISO 639-3 已被拆分为 bhomagmai 等更细语言,ISO 已明确标注 deprecated

附:常用 5 种中文区域写法

场景 推荐代码 含义 示例
大陆简体 zh-CN 或 zh-Hans-CN 中国大陆 + 简体 <html lang="zh-CN">
台湾繁体 zh-TW 或 zh-Hant-TW 中国台湾 + 繁体 <html lang="zh-TW">
香港繁体 zh-HK 或 zh-Hant-HK 中国香港 + 繁体 <html lang="zh-HK">
澳门繁体 zh-MO 或 zh-Hant-MO 中国澳门 + 繁体 <html lang="zh-MO">
新加坡简体 zh-SG 或 zh-Hans-SG 新加坡 + 简体 <html lang="zh-SG">

在 HTML 中写 zh-CNzh-TWzh-HK 就足够让搜索引擎和浏览器正确识别;如需同时声明书写体系,可写成长格式:zh-Hans-CNzh-Hant-TW 等。

四、如何立即使用?

  1. HTML 页面声明

    <html lang="zh-CN">

  2. 多语言 SEO

    <link rel="alternate" hreflang="en" href="https://w3cschool.cn/en/">
    <link rel="alternate" hreflang="ja" href="https://w3cschool.cn/ja/">

  3. CSS 语言选择器
    html[lang="zh-CN"] body { font-family: "PingFang SC", sans-serif; }

五、在编程狮在线编辑器 30 秒实战

  1. 打开 W3Cschool 在线 HTML 编辑器
  2. 粘贴:

    <!doctype html>
    <html lang="zh-CN">
    <head>
    <meta charset="utf-8">
    <title>编程狮多语言示例</title>
    <link rel="alternate" hreflang="en" href="/en/">
    <link rel="alternate" hreflang="ja" href="/ja/">
    </head>
    <body>
    <h1 lang="zh-CN">你好,世界!</h1>
    <p lang="en">Hello, world!</p>
    <p lang="ja">こんにちは、世界!</p>
    </body>
    </html>

  3. 点击【运行】→ 右键【查看源代码】,确认所有 langhreflang 均为小写两字母。

六、常见坑 & FAQ

问题 正解
中文简体/繁体怎么写? 简体:zh-CN,繁体:zh-TW
大小写写错会 404 吗? 不会 404,但 SEO 权重下降
三位代码能用吗? 能用(eng),但推荐两位(en)更短更通用
错误写法 后果
lang="cn" 无效,必须用 zh-CN
lang="zh-Hant-CN" 逻辑矛盾(大陆官方用简体)
lang="zh-TW-CN" 语法错误,只能一个区域

七、一键复制清单(放到你的项目)

<!-- 页面语言声明 -->
<html lang="zh-CN">


<!-- 多语言链接 -->
<link rel="alternate" hreflang="en" href="https://w3cschool.cn/en/">
<link rel="alternate" hreflang="ja" href="https://w3cschool.cn/ja/">
<link rel="alternate" hreflang="ko" href="https://w3cschool.cn/ko/">

八、有关 ISO 语言代码的常见问题 (FAQ)

什么是 ISO 语言代码?

ISO 语言代码是代表语言和语系的标准化代码。这些代码由国际标准化组织 (ISO) 定义,并在国际上用于识别各种环境中的语言。

为什么 ISO 语言代码很重要?

ISO 语言代码提供了一种一致且标准化的方式来表示不同系统、数据库和应用程序中的语言。它们支持准确的语言识别、数据组织和多语言支持。

ISO 语言代码的格式是什么?

ISO 语言代码通常由代表该语言的两个或三个小写字母组成。例如,“en”代表英语,“fr”代表法语,“es”代表西班牙语。

是否有不同类型的 ISO 语言代码?

是的,ISO 语言代码主要有两种类型:ISO 639-1 和 ISO 639-2。ISO 639-1 代码由两个字母的代码组成,而 ISO 639-2 代码可以是两个或三个字母。此外,还有 ISO 639-3,其中包括各个语言和不同方言的代码。

什么是 ISO 639-1?

ISO 639-1 是 ISO 639 标准的第一部分。它定义了多种语言的两个字母代码。这些代码通常用于注重简洁的上下文,例如 URL、域名和语言标签。

什么时候使用 ISO 639-2?

当语言分类需要更精细时,使用 ISO 639-2。它提供两个字母和三个字母的代码,可容纳更多的语言和变体。ISO 639-2 代码通常用于图书馆、档案馆和其他学术或文化背景。

什么是 ISO 639-3?

ISO 639-3 是 ISO 639 标准的扩展,为各个语言和不同的方言提供代码。它旨在涵盖全球所有已知语言。ISO 639-3 代码用于语言研究、记录和保存工作。

如何分配 ISO 语言代码?

ISO 语言代码是根据语言名称、方言和语言变体分配的。ISO 639 维护机构负责维护和更新该标准。这些代码通常反映该语言的英文或母语名称。

ISO 语言代码会随着时间的推移而改变吗?

是的,ISO 语言代码可能会因语言研究、语言演变或更正而发生变化。ISO 639 标准会定期更新,以反映这些变化和添加。

ISO 语言代码有任何限制吗?

虽然 ISO 语言代码涵盖多种语言,但在某些情况下,某些语言或方言可能没有特定的代码。此外,语言代码可能无法完全涵盖地区差异或独特的语言特征。

ISO语言代码可以在编程中使用吗?

是的,ISO 语言代码通常用于编程中以实现多语言功能,例如国际化和本地化。它们帮助开发人员以用户首选语言识别和显示内容。

是否有可用于查找 ISO 语言代码的资源?

是的,ISO 639 官方网站提供了注册语言代码列表。在线数据库、库和编程框架通常包括用于在各种应用程序中查找和使用 ISO 语言代码的工具。

ISO 语言代码可以用于方言或地区差异吗?

是的,ISO 639-3 代码可用于识别不同的方言或地区差异。然而,并非所有方言都有唯一的代码,有时会在需要时使用更具体的标识符。

如何为 ISO 语言代码标准做出贡献?

ISO 639 标准由 ISO 639 维护机构维护,其中包括语言学和语言分类方面的专家。如果您是语言学专家,您可以联系该机构,为标准的制定和更新做出贡献。

深入解析 :兼容模式、HTTP 头、企业策略全讲透

thbcm阅读(410)

<meta http-equiv="X-UA-Compatible" content="IE=edge">
——告诉 IE 浏览器:请用你当前最高的渲染引擎来解析网页,别再退回到旧版 IE7/8 的兼容模式。

一句话能跑,但想彻底吃透?把这篇收藏就够了!

1 诞生背景:IE「兼容模式」的毒瘤史

年代 IE 版本 默认策略 带来的坑
2006 IE7 首次引入 兼容视图 按 IE6 渲染,网页瞬间崩
2009 IE8 新增 X-UA-Compatible 不写就退回 IE7
2011 IE9 仍默认 IE7 不写 CSS3 全挂
2013 IE11 官方推荐 edge 模式 但企业组策略仍强制 IE7

因此:标签是给「老 IE 看的遗嘱」,Edge 时代已无需,但历史包袱仍在。

2 语法拆解:content 里到底能写什么?

2.1 单值写法

含义 备注
IE=5 强制 IE5 quirks 考古用
IE=7 强制 IE7 标准 老系统维护
IE=8 强制 IE8 标准 同上
IE=9 强制 IE9 标准 同上
IE=10 强制 IE10 标准 同上
IE=11 强制 IE11 标准 很少用
IE=edge 用当前最高引擎 通用推荐

2.2 组合写法(已过时,仅了解)

content="IE=edge,chrome=1"

chrome=1 触发 Google Chrome Frame(2014 已停服)。
• 当下可忽略。

3 优先级矩阵:谁说了算?

浏览器判断顺序(从高到低):

  1. HTTP 响应头

    X-UA-Compatible: IE=edge

    优先级最高,可覆盖 <meta>

  2. 页面 <meta> 标签
    必须放在 <head> 第一行(除 charset 外),否则被忽略。

  3. 用户浏览器设置
    用户手动勾选「兼容视图」会覆盖 1 和 2(企业环境常见)。

  4. 组策略 / 企业模式列表
    公司 IT 强制降级,连用户也改不了。

4 实战决策树

graph TD
    A[项目面向公众?] -->|是| B[保留 IE=edge 以防企业用户]
    A -->|否| C[内部系统?]
    C -->|仅 Edge/Chrome| D[可删除 meta]
    C -->|仍需 IE11| B

  1. IE11 及以上用户: 可完全移除该标签,但为兼容老旧企业环境,建议仍保留
  2. 现代项目(Edge/Chrome/Firefox): 不写也影响不大,写上去无害。
  3. 正确示例(放在 <head> 第一行)
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">

5 代码最佳姿势

5.1 精简模板(推荐)

编程狮HTML在线编辑器输入:

<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>示例 - 编程狮</title>
</head>
<body>……

5.2 用 HTTP 头代替(更快)

Nginx 配置:

add_header X-UA-Compatible "IE=edge";

Apache 配置:

Header set X-UA-Compatible "IE=edge"

6 常见疑问 10 连击

问题 回答
不写会怎样? 在 IE11 正常;在老企业环境可能被强退 IE7。
写错位置会怎样? 放在 <title> 后面会被 IE 忽略。
Edge 浏览器需要吗? 不需要,Edge 直接无视。
会影响 SEO 吗? 不会,但影响渲染一致性。
Chrome Frame 还能用吗? 已淘汰。
可以同时写多个值吗? 可以,如 IE=EmulateIE7, IE=9,但无意义。
IE=edge 会禁用兼容视图按钮? 不会,用户仍能手动切换。
在 SPA 里怎么动态改? 不能,必须在首字节到达前就生效。
Electron/CEF 需要吗? 不需要。
当下还能删吗? 面向 C 端可以删;面向政企建议保留。

7 一句话总结

老 IE 的遗嘱,新世界的废纸:
• 面向公众 → 可删
• 政企内网 → 留一行 <meta> 保平安

浏览器模式 & Doctype 全解析|IE 兼容视图 + 标准模式速记

thbcm阅读(404)

浏览器模式 & <!DOCTYPE><meta X-UA-Compatible> 终极备忘

——基于 Hixie 经典长文《Activating Browser Modes with Doctype》重新梳理

由编程狮(w3cschool.cn)翻译、精简、本土化,5 分钟背完 90% 考点

1 一句话结论(先背再读)

所有新页面用一句头即可:

<!doctype html>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
作用 含义
<!doctype html> 触发 标准模式(Chrome/Firefox/Edge 通用)
IE=edge 让 IE8~11 永远不用兼容视图

2 浏览器到底有几种模式?

2.1 通用三大模式(所有浏览器)

模式 触发方式 结果
Quirks(怪异模式) 无 <!DOCTYPE> 或早期 DTD 模拟 IE5.5,CSS 盒模型错位
Almost Standards HTML 4.01 Transitional 等 表格行高计算旧逻辑(图片缝隙
Standards(标准模式) <!doctype html> 或现代 DTD 按规范渲染,推荐

2.2 IE 独有的附加模式(了解即可)

含义 备注
IE=EmulateIE7 强制 IE7 渲染 仅遗留系统维护
IE=EmulateIE8 强制 IE8 渲染 同上
IE=Edge 当前最高 IE 引擎 2025 年通用

3 触发优先级(记住 3 句话)

  1. HTTP 响应头 > <meta> > 用户手动兼容视图
  2. IE8+ 默认看 <!DOCTYPE>,除非被组策略/用户按钮覆盖
  3. Edge(Chromium)已彻底抛弃 IE 模式,可忽略

4 实战模板(复制即用)

4.1 HTML5 通用起手

<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>编程狮示例页</title>
</head>
<body>
  <h1>Hello W3Cschool!</h1>
</body>
</html>

4.2 服务器直接加头(更快)

Nginx:

add_header X-UA-Compatible "IE=edge";

Apache:

Header set X-UA-Compatible "IE=edge"

5 常见坑位速查

场景 风险 解决
企业内网被强制 IE7 CSS3/ES5 失效 HTTP 头 + <meta> 双保险
iframe 嵌套 父页面强制兼容视图 同样加头
旧项目用 HTML4 Transitional 触发 Almost Standards 升级 HTML5

6 决策树(1 张图秒懂)

graph TD
    A[新页面?] -->|是| B[用 `<!doctype html>` + `IE=edge`]
    A -->|否| C[旧系统]
    C -->|仅 IE7| D[临时 `IE=EmulateIE7`]
    C -->|现代浏览器| B

7 一句话速背口诀

“起手 <!doctype html&,IE 加 edge,企业头也配;

怪异模式别碰,表格图片不碎。”

HTML Boolean 属性速记表|disabled、checked、async 全用法

thbcm阅读(428)

零基础速记 HTML Boolean 属性
——编程狮(w3cschool.cn)3 分钟背完、直接上手

一句话记住

只要写了属性名,值就是 true;想表示 false,就干脆别写这个属性。

一、什么是 Boolean 属性?

  • 不写值值等于属性名本身,都表示 true
  • 根本不存在 这个属性,则表示 false
  • 官方叫 布尔属性,也叫 开关属性

二、常见 Boolean 属性一览(收藏级)

属性 元素 作用 示例
disabled <input> <button> <select> … 禁用控件 <input disabled>
checked <input type=checkbox/radio> 默认选中 <input checked>
selected <option> 默认选中 <option selected>
readonly <input> <textarea> 只读 <input readonly>
multiple <select> <input type=file> 多选 <select multiple>
required <input> <textarea> <select> 必填 <input required>
autofocus <input> <button> <select> <textarea> 页面加载后自动聚焦 <input autofocus>
hidden 全局属性 隐藏元素 <div hidden>
async <script> 异步加载脚本 <script async src="…">
defer <script> 延迟执行脚本 <script defer src="…">
loop <audio> <video> 循环播放 <video loop>
muted <audio> <video> 静音 <audio muted>
controls <audio> <video> 显示控制条 <video controls>
autoplay <audio> <video> 自动播放 <video autoplay>
novalidate <form> 关闭浏览器校验 <form novalidate>

三、四种写法对比(全部合法,但第 1 种最简洁)

写法 含义 推荐度
<input disabled> true  ⭐⭐⭐
<input disabled=""> true  ⭐⭐
<input disabled="disabled"> true 
<input disabled="false"> 仍是 true!

注意

disabled="false" 并不会变成 false,因为只要出现属性名就是 true

四、实战 30 秒

编程狮HTML在线编辑器 输入:

<!doctype html>
<input type="checkbox" checked> 默认选中<br>
<input type="checkbox"> 未选中<br>
<input type="text" placeholder="正常">
<input type="text" placeholder="禁用" disabled>

运行后 → 第一个复选框默认打钩,第二个未打钩;第二个文本框无法输入。

五、记忆口诀

“布尔属性像开关,写了就 ON,不写就 OFF。”

六、更多资源推荐

JSDoc 标签大全|70+ 官方标签速查表

thbcm阅读(400)

JSDoc 3 是一个用于 JavaScript 的API文档生成器,类似于 Javadoc 或 phpDocumentor。可以将文档注释直接添加到源代码中。JSDoc 工具将扫描您的源代码并为您生成一个 HTML 文档网站。

JSDoc 速通手册
——编程狮(w3cschool.cn)为前端新手量身打造的“一行一用”速查表

看完就能写注释,写完就能出文档!

1 起手式:一条万能模板

/**
 * @file  文件描述
 * @author 编程狮 <dev@w3cschool.cn>
 * @license MIT
 * @since   2025-08-06
 * @version 1.0.0
 */

2 常用标签「一行一用」

场景 简写模板 备注
描述变量 /** @type {number} */ let count 写类型即可
描述函数 /** @param {string} name - 用户名 */ 必传参数
可选参数 /** @param {number} [age=18] - 年龄 */ 中括号 + 默认值
多个类型 /** @type {(string\|number)} id */ 管道符
对象结构 /** @type {{a: string, b: number}} */ 行内对象
返回类型 /** @returns {Promise<boolean>} */ Promise 也支持
回调函数 /** @callback FetchCb @param {string} url @returns {Promise} */ 先定义后使用
枚举 /** @enum {number} */ const STATUS = { OK: 200, ERROR: 500 } 自动生成枚举文档
类注释 /** @class User @desc 用户实体 */ 构造函数上加
弃用 /** @deprecated 用 fetchDataAsync 代替 */ IDE 会画删除线

3 完整函数示例(复制即用)

/**
 * 获取用户详情
 * @func
 * @param {string} id - 用户ID
 * @param {object} [options] - 可选配置
 * @param {boolean} [options.cache=true] - 是否缓存
 * @returns {Promise<User>} 用户实例
 * @throws {Error} 当网络异常
 * @example
 * getUser('123').then(console.log);
 */
async function getUser(id, { cache = true } = {}) {
  if (!id) throw new Error('id 不能为空');
  return fetch(`/api/user/${id}?cache=${cache}`).then(r => r.json());
}

4 一键生成文档

  1. 安装
    npm i -D jsdoc
  2. 配置 jsdoc.json
    {
     "source": { "include": ["src"] },
     "opts": { "destination": "docs" }
    }
  3. 运行
    npx jsdoc -c jsdoc.json
  4. 打开 docs/index.html 查看效果。

5 速背口诀

“变量加 @type,函数加 @param,返回加 @returns,枚举用 @enum,弃用 @deprecated 别忘写!”

6 JSDoc 3 全部标签速查表(共 70+)

按使用频率分 4 级:

⭐⭐⭐ 必背(蓝框) ⭐⭐ 常用(绿框) ⭐ 进阶(灰框) ◦ 其他(了解)

① 文件级

标签 说明 示例
@file / @fileoverview 文件描述 @file 用户模块入口
@author 作者 @author 编程狮 <dev@w3cschool.cn>
@copyright 版权 @copyright 2025 w3cschool
@license 许可证 @license MIT
@version 版本 @version 1.2.0
@since 起始版本 @since 2025-08-06

② 类型与变量

标签 说明 示例
@type ⭐⭐⭐ 变量/返回值类型 @type {number}
@typedef ⭐⭐ 自定义类型 @typedef {{x:number,y:number}} Point
@callback ⭐⭐ 回调类型 @callback FetchCb
@enum ⭐ 枚举 @enum {number} STATUS
@var ◦ 变量别名 @var {string} title
@constant / @const ⭐⭐ 常量 @constant {string} API_ROOT
@readonly ⭐ 只读 @readonly
@default ⭐ 默认值 @default 42

③ 函数 / 方法

标签 说明 示例
@param / @arg ⭐⭐⭐ 参数 @param {string} name - 用户名
@returns / @return ⭐⭐⭐ 返回值 @returns {Promise<User>}
@throws / @exception ⭐⭐ 抛出异常 @throws {Error} 参数错误
@example ⭐⭐ 用法示例 @example add(1,2) // 3
@async ⭐ 异步 @async
@generator / @yields ◦ 生成器 @yields {number}
@this ◦ this 指向 @this {HTMLElement}

④ 类 / 模块 / 命名空间

标签 说明 示例
@class / @constructor ⭐⭐⭐ 构造函数 @class Person
@classdesc ⭐ 类描述 @classdesc 用户实体
@extends / @augments ⭐⭐ 继承 @extends Animal
@implements ⭐ 实现接口 @implements Drawable
@interface ⭐ 接口 @interface EventEmitter
@abstract / @virtual ◦ 抽象 @abstract draw()
@override ⭐ 重写 @override
@static ⭐ 静态成员 @static findById()
@instance ◦ 实例成员 @instance
@inner ◦ 内部成员 @inner toString
@memberof ⭐ 隶属对象 @memberof utils
@namespace ⭐⭐ 命名空间 @namespace math
@module ⭐⭐ 模块 @module user/api
@exports ⭐ 出口 @exports UserModel
@requires ⭐ 依赖模块 @requires lodash

⑤ 成员可见性

标签 说明
@public ⭐ 公开(默认)
@private ⭐⭐ 私有
@protected ⭐⭐ 受保护
@package ◦ 包内可见

⑥ 事件与监听

标签 说明
@event ⭐ 定义事件
@listens ◦ 监听事件
@fires / @emits ◦ 触发事件

⑦ 其他实用标签

标签 说明
@description / @desc ⭐⭐ 长描述
@summary ⭐ 简短描述
@deprecated ⭐⭐ 已弃用
@see ⭐ 参考链接
@link / @linkcode / @linkplain ⭐ 内联链接 {@link URL}
@tutorial ◦ 教程链接
@ignore ◦ 忽略该符号
@todo ⭐ TODO 任务
@borrows ◦ 借用其他注释
@name ◦ 强制名称(用于虚拟注释)
@variation ◦ 同名变体
@external ◦ 外部类型
@mixin / @mixes ⭐ 混入

⑧ 模板与泛型

标签 说明
@template ⭐ 泛型参数 @template T
@satisfies ◦ TypeScript 专用

⑨ 完整模板速用

/**
 * @file 用户模块
 * @author 编程狮 <dev@w3cschool.cn>
 * @since 1.0.0
 */


/**
 * @typedef {Object} User
 * @property {string} name  用户名
 * @property {number} age   年龄
 */


/**
 * 创建用户
 * @func
 * @param {User} user
 * @returns {Promise<User>}
 * @throws {Error} 参数非法
 * @example
 * createUser({name:'Tom',age:18})
 */
async function createUser(user) { ... }

邪修 Python 10 连击|黑魔法代码片段合集

thbcm阅读(460)

“邪修 Python” 通常指用非常规、违反直觉,但又巧妙到令人拍案叫绝的黑魔法写法。下面 10 个片段,每个都在 “千万别在正式项目里用” 的前提下,展示 Python 的极限玩法。看完你会惊呼:原来还能这么写!

️ 警示:仅供技术猎奇、面试谈资、代码高尔夫(Code Golf)或 “邪修” 自嗨。生产代码请遵守 PEP 8 与可读性原则。

1️⃣ 列表推导的“核爆”写法

# 一行生成九九乘法表
_ = [print(f'{j}×{i}={i*j}', end='\t'*(j!=i)) for i in range(1, 10) for j in range(1, i+1)]

print 塞进列表推导,只为省行数。

2️⃣ or / and 链实现“短路”赋值

# 看似三元,实则短路
value = a and b or c        # 当 b 为假时直接翻车

正确写法:b if a else c,别用邪修。

3️⃣ 字典字面量“原地爆炸”

# 字典推导 + 条件表达式
d = {k: v for k, v in zip('abc', range(3)) if (lambda x: x**2)(v) < 4}

lambda 塞到 if 里,阅读体验当场去世。

4️⃣ 一行合并多层嵌套列表

# 三重列表推导 + sum
flat = sum([sum([[i*j*k for k in range(3)] for j in range(3)], []) for i in range(3)], [])

sumflatMap,速度感人。

5️⃣ __import__ 动态导入 + 链式调用

# 一行实现“打印当前时间”
__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')

import 当函数,比 import datetime 更“邪”。

6️⃣ setattr + lambda 批量装弹

# 给类动态挂 100 个方法
class A: pass
[setattr(A, f'f{i}', lambda self, x=i: x**2) for i in range(100)]

运行期改类字典,IDE 永远猜不到。

7️⃣ 装饰器“套娃”地狱

# 三层装饰器,每层都用 lambda
@lambda f: (lambda g: (lambda h: lambda *a: h(g(f(*a)))))
def add(x): return x + 1

真正的“装饰器洋葱”。

8️⃣ exec + 字符串模板生成代码

# 动态生成并执行函数体
code = 'def foo(x): return x * 2'
exec(code)

把 Python 当 PHP 用,安全审计直接爆炸。

9️⃣ 元类“暗改”类行为

class Meta(type):
    def __new__(cls, name, bases, ns):
        ns['__repr__'] = lambda self: "I am evil"
        return super().__new__(cls, name, bases, ns)


class Evil(metaclass=Meta): pass

类还没出生就被“邪修”附体。

一行实现“斐波那契”

# 递归 + 三目 + 切片
fib = lambda n: n if n < 2 else fib(n-1) + fib(n-2)
[fib(i) for i in range(10)]

复杂度 O(2ⁿ),运行即“献祭”CPU。

邪修心法口诀

“能写一行绝不写两行,能用黑魔法绝不走正道,

可读性?那是正道修士才考虑的事!”

彩蛋:把 Python 变成“JS”

# 链式属性设置
class ChainDict(dict):
    def __getattr__(self, key): return self.setdefault(key, ChainDict())
d = ChainDict(); d.a.b.c = 1

体验一把“点语法”无限链式调用。

Sublime Text 安装 Package Control 教程

thbcm阅读(482)

Sublime Text 3/4 安装 Package Control
——编程狮(w3cschool.cn)3 步搞定

1 命令面板(最简单)

系统 按键
Windows / Linux Ctrl+Shift+P
macOS Cmd+Shift+P

输入 Install Package Control → 回车 → 等待 3 秒,成功即弹出提示。

2 手动安装

  1. 下载离线包
    Package Control.sublime-package
  1. 放入目录
    Sublime Text → Preferences → Browse Packages…  
    返回上一级 → 进入 Installed Packages  
    粘贴下载的 .sublime-package
  1. 重启 Sublime Text 即可。

3 验证安装

命令面板 → 输入 Package Control: List Packages → 出现列表即成功。

4 常用下一步(一键复制)

# 安装中文本地化
Package Control: Install Package → ChineseLocalizations


# 安装 Emmet
Package Control: Install Package → Emmet


# 安装主题
Package Control: Install Package → Theme - One Dark

邪修 Java 10 连击|反射爆破单例、字节码改 JDK、Lambda 内联异常

thbcm阅读(404)

邪修 Java,10 段“千万别上生产”的黑魔法代码
——由编程狮(w3cschool.cn)出品,仅供猎奇

️ 每条都踩红线:可读性 0、维护成本 ∞,面试可炫技,项目里敢用就等死。

1️⃣ 一行 Hello World(无分号、无 main)

class H{static{System.out.println("邪修Java");System.exit(0);}}

  • 运行javac H.java && java H
  • 原理<clinit> 静态块当入口,直接 System.exit 防止 JVM 继续初始化。

2️⃣ 用反射把 String 变可变

String s = "abc";
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
((char[]) f.get(s))[0] = 'A';
System.out.println(s); // 输出 Abc

破坏 final char[],常量池一起陪葬。

3️⃣ 宏替换式“泛型擦除”

import java.lang.reflect.*;
List<String> list = new ArrayList<>();
list.add("123");
Method m = List.class.getMethod("add", Object.class);
m.invoke(list, 42);        // 擦除后成功塞进 Integer
System.out.println(list);  // [123, 42]

编译期类型检查形同虚设。

4️⃣ 双重括号初始化“匿名派生”

List<Integer> li = new ArrayList<>() {{
    add(1); add(2); add(3);
}};

每用一次就偷偷创建匿名内部类,爆炸式内存泄漏。

5️⃣ 枚举单例 + 反射爆破

enum Singleton { INSTANCE; }
public static void main(String[] args) throws Exception {
    Constructor<Singleton> c = Singleton.class.getDeclaredConstructor(String.class,int.class);
    c.setAccessible(true);
    Singleton evil = c.newInstance("EVIL", 1);  // 破坏单例
}

枚举号称防反射?邪修眼里不存在的。

6️⃣ 字节码注入(Javassist 一行流)

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("java.util.ArrayList");
cc.addMethod(CtNewMethod.make("public int size(){return 999;}", cc));
cc.toClass();
System.out.println(new ArrayList<>().size()); // 999

运行期改 JDK 源码,JVM 当场裂开。

7️⃣ 注解 + 反射 = 魔法路由

@Retention(RUNTIME) @interface Route { String value(); }
@Route("/hello") class HelloController { }


public static void invoke(String path) throws Exception {
    for (Class<?> c : Class.forName("").getClasses()) {
        if (c.isAnnotationPresent(Route.class) &&
            c.getAnnotation(Route.class).value().equals(path)) {
            c.getDeclaredConstructor().newInstance(); // 邪修式路由
        }
    }
}

0 行配置,全靠字符串比对,性能灾难。

8️⃣ 动态代理“偷天换日”

Map<String,Integer> map = (Map) Proxy.newProxyInstance(
        Map.class.getClassLoader(),
        new Class[]{Map.class},
        (proxy, method, args) -> "size".equals(method.getName()) ? 404 : null
);
System.out.println(map.size()); // 404

Map 接口秒变 404 页面。

9️⃣ 异常吞掉还能继续跑

try {
    int x = 1 / 0;
} catch (RuntimeException e) {
    throw new RuntimeException(new RuntimeException(e)); // 套娃异常
}

日志里 10 层 cause,定位直接崩溃。

终极一行:Lambda 内联异常

public static void main(String[] args) {
    ((Runnable)(() -> { throw new RuntimeException("boom"); })).run();
}

没有方法名,栈跟踪里只有两帧,调试器当场自闭。

邪修口诀

“Java 正道是 public static void main

邪修眼里万物皆可 static{}、反射、字节码。”

邪修 C++ 10 连击|模板爆炸、运行时 JIT、UB 套娃

thbcm阅读(432)

邪修 C++ ,10 段“千万别上生产”的黑魔法代码
——仅供技术猎奇,切勿真用!

️ 每条都踩 UB/UBSAN/ODR 红线,可读性 0,维护成本 ∞

面试可炫技,项目里敢用就等死!

1️⃣ 一行 main 也没有的程序

struct A { A(){ puts("邪修C++"); exit(0); } } a;

全局对象构造期直接 exit,跳过整个 CRT。

2️⃣ 模板元编程“阶乘”在编译期爆炸

template<int N> struct Fac{ enum{ value = N * Fac<N-1>::value }; };
template<> struct Fac<0>{ enum{ value = 1 }; };
constexpr auto x = Fac<20>::value;   // 编译期递归 20 层

图灵完备模板,CPU 0 负载,编译器 100% 负载。

3️⃣ SFINAE 黑魔法:真假分支同时存在

template<bool> struct tag{};
template<class T> auto f(T t, tag<true>) -> int { return t + 1; }
template<class T> auto f(T t, tag<false>) -> int { return t - 1; }
#define f(x) f(x, tag<(x > 0)>{})

宏 + 模板 + 重载,IDE 当场罢工。

4️⃣ 指针 + 位域 + 联合体重叠

union {
    struct { unsigned long long a:1, b:63; };
    unsigned long long v;
} u{ .v = 0x8000000000000000ULL };
std::cout << u.a;   // 1 或 0?平台决定

UB 大杂烩,UBSAN 直接红屏。

5️⃣ 运行时生成机器码

#include <sys/mman.h>
unsigned char code[] = {0xB8,0x2A,0x00,0x00,0x00,0xC3}; // mov eax,42; ret
void* buf = mmap(nullptr, 4096, PROT_READ|PROT_WRITE|PROT_EXEC,
                 MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
memcpy(buf, code, sizeof(code));
int (*p)() = (int(*)())buf;
std::cout << p();   // 42

运行时 JIT,杀毒软件报警。

6️⃣ 双重括号初始化 + 匿名派生

std::vector<int> v = std::vector<int>({{1, 2, 3}}){};

每次创建匿名派生类,RTTI 爆炸。

7️⃣ CRTP 静态多态“元宇宙”

template<class Derived>
struct Base { void foo(){ static_cast<Derived*>(this)->impl(); } };
struct D: Base<D>{ void impl(){ puts("CRTP"); } };

不依赖虚函数,却实现多态,模板实例化膨胀。

8️⃣ 宏黑魔法:逗号运算符一行流

#define evil(x) (printf("A\n"), printf("B\n"), x)
int val = evil(42);

宏里玩副作用,调试器断点失效。

9️⃣ 三目运算符 + 逗号运算符链式地狱

int x = 1, y = 2;
int res = (x > y) ? (puts("x>y"), x) : (puts("x<=y"), y);

puts 塞进表达式,阅读体验当场去世。

异常 + noexcept 套娃

void boom() noexcept { throw 42; } // UB:noexcept 里抛异常

标准直接 UB,程序可能 std::terminate

邪修口诀

“模板撑爆编译器,指针踏穿内存墙;

UB 当特性,UBSAN 当背景音。”

PS

想要正经学习 C++ 请从编程狮的《C++ 入门课程》开始!

邪修 C 语言 10 连击|计算型 goto、零长数组、运行时改机器码

thbcm阅读(430)

邪修 C 语言,10 段“直接劝退”的黑魔法代码
——仅供技术猎奇,切勿上生产!

编译器警告、UB(未定义行为)、UBSAN 狂怒,请自备防护眼镜 🧨

1️⃣ 一行 main 都没有的程序

#include <stdio.h>
void _start(){puts("邪修C");}

链接时加 -nostartfiles,直接跳过 CRT,Linux 裸奔。

2️⃣ Duff’s Device —— switch 跳进 while

void evil_memcpy(char *dst, char *src, size_t n){
    switch(n & 7){
        case 0: while(n--){ *dst++ = *src++;
        case 7: *dst++ = *src++;
        case 6: *dst++ = *src++;
        case 5: *dst++ = *src++;
        case 4: *dst++ = *src++;
        case 3: *dst++ = *src++;
        case 2: *dst++ = *src++;
        case 1: *dst++ = *src++;
                }break;
    }
}

循环展开 + switch 套 while,上古时代“手动 SIMD”。

3️⃣ 宏黑魔法:让 if 变成代码块

#define evil_if(x) if(x);else


evil_if(0)
    puts("你猜我会打印吗?");

宏定义末尾的分号把 else 直接悬空,编译器当场裂开。

4️⃣ 指针运算玩出花

int a[5] = {1,2,3,4,5};
printf("%d\n", 3[a]); // 输出 4

a[3]3[a] 等价,编译器:你们开心就好。

5️⃣ 结构体“零长度数组”末班车

struct msg {
    int len;
    char data[0]; // 邪修柔性数组
};
struct msg *m = malloc(sizeof *m + 100);
strcpy(m->data, "hello");

0 长度数组是 GNU 私货,标准 C99 请用 char data[]

6️⃣ 位域重叠 + 联合体重写

union {
    struct { unsigned a:4, b:4; } nibble;
    unsigned char byte;
} u = {.byte = 0xAB};
printf("%x %x\n", u.nibble.a, u.nibble.b); // 平台决定大小端

一步踏进 未定义行为 的大坑。

7️⃣ 自修改机器码(mmap 版)

#include <sys/mman.h>
char *code = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC,
                  MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
unsigned char payload[] = {0x48,0xC7,0xC0,0x01,0x00,0x00,0x00,0xC3}; // x86-64: mov rax,1; ret
memcpy(code, payload, sizeof payload);
int (*ret1)(void) = (int (*)(void))code;
printf("ret=%d\n", ret1());

运行时生成 shellcode,杀毒软件直接报警。

8️⃣ 多重 sizeof 套娃

printf("%zu\n", sizeof sizeof sizeof "abc"); // 输出 8(64 位指针)

连续 sizeof 把任何表达式剥成 size_t,毫无营养。

9️⃣ 逗号运算符“一行流”

int x = (printf("a\n"), printf("b\n"), 3);
printf("%d\n", x); // 依次打印 a b 3

把副作用写进表达式,debug 时想打人。

GOTO 地狱 + 标签运算

int main(){
    static const void *tab[] = {&&l0, &&l1, &&l2};
    int i = 1;
    goto *tab[i];
l0: puts("zero"); return 0;
l1: puts("one");  return 0;
l2: puts("two");  return 0;
}

计算型 goto(GNU C 扩展)手写跳转表。

邪修口诀

“内存随便指,宏里藏杀机,UB 当特性,编译器哭泣。”

联系我们