跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

BCP 47:互联网语言标识标准详解

引言:什么是BCP 47?

在当今全球化的互联网环境中,准确标识内容所使用的语言至关重要——从网页显示到内容分发,从搜索引擎优化到辅助工具适配,都需要一种标准化的方式来告诉系统和用户:“这段内容说的是什么语言”。BCP 47正是为解决这一问题而设计的国际标准。

BCP 47的全称是 Best Current Practice 47(最佳现行实践第47号),由互联网工程任务组(IETF)发布,定义了一套用于标识人类语言的标准化“语言标签”(Language Tag)格式。这套标准广泛应用于现代互联网技术中,包括HTML、HTTP协议、XML、Unicode以及各类操作系统和编程环境。

BCP 47的构成:它不是一份文件,而是两份

“BCP 47”这个名称有一个容易被忽视的特点:它并不是单一的RFC文档,而是一个由两份核心RFC文档组成的系列。BCP编号本身是一个稳定的标识符,指向一组与特定IETF流程或推荐指南相关的RFC文档。

BCP 47包含以下两份规范:

  1. RFC 5646:《用于识别语言的标签》(Tags for Identifying Languages)——定义语言标签的语法结构、内容构成和语义,以及如何注册新的子标签值。这是构建语言标签的核心规范,2009年9月发布,取代了早期的RFC 4646、3066和1766。
  2. RFC 4647:《语言标签的匹配》(Matching of Language Tags)——定义如何比较和匹配语言标签,例如如何根据用户偏好的语言列表选择最合适的内容。它描述了过滤(filtering)和查找(lookup)两种匹配机制,用于内容协商等场景。

将规范分为“标签结构”和“匹配方法”两部分,既保持了核心语法的稳定,又为匹配算法的演进提供了独立空间。

语言标签的语法结构

BCP 47定义的语言标签由连字符(-)连接的一个或多个子标签(subtag)构成。最基本的格式是:

语言 – 文字 – 地区

其中,“语言”子标签是唯一必需的,其他均为可选。

主要语言子标签(必需)

这是语言标签的核心,通常由2到3个小写字母组成,源自ISO 639标准:

  • en = 英语
  • zh = 汉语
  • es = 西班牙语
  • ja = 日语

截至2009年的版本,BCP 47已整合了超过7000种语言的标识代码,包括ISO 639-3标准中新增的大量语种。

文字子标签(可选)

用于指定该语言的书写系统,由4个字母组成,首字母大写,源自ISO 15924标准:

  • zh-Hans = 简体中文
  • zh-Hant = 繁体中文
  • ja-Kana = 用片假名书写的日语
  • ru-Cyrl = 用西里尔字母书写的俄语

如果某种语言使用最典型的书写方式(如英语使用拉丁字母),通常不需要指定文字子标签。

地区子标签(可选)

用于标识特定地理区域使用的语言变体,可以是两个大写字母(ISO 3166国家代码)或三个数字(UN M.49地区代码):

  • en-US = 美国英语
  • en-GB = 英国英语
  • es-ES = 西班牙本土西班牙语
  • es-419 = 拉丁美洲西班牙语

如果同时使用文字和地区子标签,文字子标签排在地区子标签之前,如 ru-Cyrl-BY 表示“白俄罗斯使用的、以西里尔字母书写的俄语”。

示例标签

标签含义
en英语(泛指)
en-US美国英语
en-GB英国英语
zh-Hans简体中文
zh-Hant-TW台湾地区使用的繁体中文
es-419拉丁美洲西班牙语

扩展机制:超越基本标识

高级子标签类型

除了上述三种主要子标签,BCP 47还支持更多精细化描述:

  • 扩展语言子标签(extlang):三字母代码,用于标识宏语言下属的具体语种,与特定主语言标签配合使用。例如,zh-cmn 中的 cmn 表示官话/北方话。
  • 变体子标签(variant):5至8个字母的代码,用于标识特定方言或语言变体,由IANA登记。
  • 私用子标签(private-use):以 x- 开头,用于非公开的、自定义的语言标识。

Unicode扩展

BCP 47的扩展机制允许携带超越语言本身的信息。Unicode联盟维护着两种重要扩展:

  • -u 扩展(区域设置扩展):用于携带区域设置相关信息,如排序规则、日历、时区等。例如,en-GB-u-kn-true 表示“英国英语,启用数字排序(kn = numeric)”。
  • -t 扩展(转换内容扩展):用于标识内容转换来源或目标语言。例如,ja-Kana-t-it 表示“从意大利语转换而来的、用片假名书写的日语”。

这些扩展使得BCP 47能够同时服务于内容标识和国际化功能配置两个层面,极大地扩展了其实用范围。

IANA子标签注册中心:唯一的权威来源

创建符合BCP 47的语言标签时,所有合法的子标签代码都收录在IANA(互联网号码分配机构)维护的“语言子标签注册中心”(Language Subtag Registry)中。该注册中心包含近八千个条目,涵盖语言、文字、地区、变体等各类子标签。

每个注册条目包含以下关键信息:

  • Type:子标签类型(language、script、region、variant等)
  • Subtag:实际使用的代码
  • Description:描述信息
  • Added:添加日期
  • Deprecated(如有):标记为废弃,并给出推荐的替代值(Preferred-Value)

例如,查找希伯来语会发现:

Type: language
Subtag: he
Description: Hebrew

而旧的代码 iw 则标记为 Deprecated,建议使用 he。

实践指南:如何选择正确的语言标签

W3C在其国际化指南中提供了以下建议:

  1. 遵循“黄金法则”——尽量简短:只有在必要时才添加额外的子标签。通常,仅需一个主要语言子标签就已足够。
  2. 使用IANA注册中心查找:通过搜索语言名称,在注册中心中找到对应的Subtag值。
  3. 优先使用具体而非泛指的子标签:避免使用语言组(collection)子标签;对于宏语言(macrolanguage),如 zh(汉语),建议在可能的情况下使用更具体的子标签(如 cmn 表示官话),但需注意向后兼容性问题——大多数现有系统将 zh 理解为官话,使用 cmn 可能导致兼容性问题。
  4. 避免使用已废弃的子标签:检查注册记录是否包含 Deprecated 字段,如有则使用 Preferred-Value 指定的替代值。
  5. 注意大小写约定:虽然语言标签整体不区分大小写,但约定俗成的写法是:语言子标签小写、文字子标签首字母大写、地区子标签大写。在不区分大小写的系统上,建议遵循此约定以增强可读性。

应用场景

BCP 47语言标签在互联网技术中无处不在:

  • HTML的lang全局属性:定义元素内容的语言,帮助浏览器、屏幕阅读器和搜索引擎理解内容。
  • HTTP内容协商:服务器根据用户浏览器发送的Accept-Language头信息,选择最合适的语言版本内容。
  • 系统与应用程序本地化:操作系统和应用根据语言标签加载对应的界面翻译和区域设置。
  • 国际化API:如JavaScript的Temporal对象、Canvas API、翻译和语言检测API等均使用BCP 47标签。

结语

BCP 47作为互联网的语言标识标准,通过一套严谨且灵活的标签体系,为全球化的数字内容交换提供了基础设施。从简单如 en 的通用标识,到精细如 en-GB-u-kn-true 的完整区域设置,BCP 47能够在简洁性与准确性之间取得平衡。理解并正确使用BCP 47语言标签,是开发国际化应用和构建全球化网站的基本功,也是让内容被世界范围内用户准确理解和有效访问的关键一步。

作者

老丹

关注我
其他文章
上一个

字符编码的基石与分野:深度剖析 ASCII 与 ISO-8859-1 的本质、演进及现代意义

下一个

SSH X11转发机制深度解析:在远程终端打开本地图形界面的技术原理与实践

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Linux系统的安全基石:深入理解可插拔认证模块(PAM) 2026年7月27日
  • vsftpd 完全指南:从核心原理到Docker容器化部署 2026年7月27日
  • 互联网的”导航”安全卫士:深入解读DNSSEC 2026年7月27日
  • Ubuntu DNS 配置完全指南 2026年7月27日
  • 在 Ubuntu 中使用 Certbot 的操作指南 2026年7月27日

文章分类

  • C/C++开发 (13)
  • Docker容器 (3)
  • Linux工具包 (10)
  • Linux服务配置 (33)
  • Linux系统 (10)
  • OpenWrt路由 (2)
  • Shell脚本 (3)
  • 安防技术 (4)
  • 数据安全 (30)
  • 网络协议 (17)
  • 计算机理论 (22)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号