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包含以下两份规范:
- RFC 5646:《用于识别语言的标签》(Tags for Identifying Languages)——定义语言标签的语法结构、内容构成和语义,以及如何注册新的子标签值。这是构建语言标签的核心规范,2009年9月发布,取代了早期的RFC 4646、3066和1766。
- 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在其国际化指南中提供了以下建议:
- 遵循“黄金法则”——尽量简短:只有在必要时才添加额外的子标签。通常,仅需一个主要语言子标签就已足够。
- 使用IANA注册中心查找:通过搜索语言名称,在注册中心中找到对应的Subtag值。
- 优先使用具体而非泛指的子标签:避免使用语言组(collection)子标签;对于宏语言(macrolanguage),如
zh(汉语),建议在可能的情况下使用更具体的子标签(如cmn表示官话),但需注意向后兼容性问题——大多数现有系统将zh理解为官话,使用cmn可能导致兼容性问题。 - 避免使用已废弃的子标签:检查注册记录是否包含
Deprecated字段,如有则使用Preferred-Value指定的替代值。 - 注意大小写约定:虽然语言标签整体不区分大小写,但约定俗成的写法是:语言子标签小写、文字子标签首字母大写、地区子标签大写。在不区分大小写的系统上,建议遵循此约定以增强可读性。
应用场景
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语言标签,是开发国际化应用和构建全球化网站的基本功,也是让内容被世界范围内用户准确理解和有效访问的关键一步。