IETF語言標籤

语言标签是语言代码的缩写表示，例如en表示英语，pt-BR表示巴西葡萄牙语。由互联网工程任务组 (IETF)的“BCP 47”文档系列定义。现在标准化为RFC 5646 (引用了相关的RFC 5645)与RFC 4647, IANA语言子标签登记。使用的各成分来自ISO 639, ISO 15924, ISO 3166-1, UN M.49.
这种语言标签用于许多现代的计算标准，包括IETF的互联网协议如HTTP, XML 以及PNG,，SGML，Unicode，ANSI，ECMA。Microsoft的Windows操作系统使用它代替过时的LCID，来表示locale。

历史

IETF语言标签的最早版本是1995年3月发布的RFC 1766。使用ISO 639的2字母语言代码，ISO 3166的2字母国家地区代码，允许登记的标签携带variant或书写文字子标签。
2001年1月发布RFC 3066, 使用ISO 639-2的3字母语言代码。
2006年9月发布RFC 4646 (规范的主体)与RFC 4647 (处理匹配行为)。RFC 4646增加了使用ISO 15924 的4字母书写文字代码与UN M.49的3数字地理分区码。 
2009年9月发布RFC 5646，引入了3字符码的ISO 639-3与639-5作为语言子标签。

与其他国际标准的关系

虽然源自ISO或UN的标准，但并不是严格遵循。特别是ISO 639, ISO 15924, ISO 3166, UN M.49等标准撤回某些编码，甚至改变某些编码所指的时候，RFC 4646规定语言标签仍然保持最初含义不变。

ISO 639-3 与 ISO 639-1

RFC 4646之前登记的语言标签现在分为"grandfathered"或"redundant"，视其是否满足目前的语法而定。并且是过时的。现在采用ISO 639-3语言子标签。例如，nan取代了zh-min-nan表示闽南语；hak取代了i-hak、zh-hakka表示客家话；ase取代了sgn-US表示美国手语。

ISO 639-5 与 ISO 639-2

ISO 639-5使用3字母表示一个语言群中所有的语言。而ISO 639-2使用3字母表示一个语言群中没有独立语言标签的那些语言。例如，ISO 639-2代码afa表示"Afro-Asiatic (Other)"，不包含阿拉伯语。而ISO 639-5中的这个代码表示"Afro-Asiatic languages"，包含亚非语系所有语言。这一变化发生在2009年。
ISO 639-5为了向后兼容ISO 639-2，对于这些老的代码，定义了grouping type attribute。
BCP 47定义了"Scope"属性用于语言集子标签的辨别。但是没有定义任何inclusive或exclusive属性，也没有使用ISO 639-5的grouping type attribute。
ISO 639-5没有定义哪些语言属于某个语言集。因此RFC 5646不建议使用语言集，除非是那些非特定的语言集，如"Multiple languages"与 "Undetermined"。

ISO 15924, ISO/IEC 10646 与 Unicode

某些主语言子标签携带了属性"Suppress-Script"，通常某个书写系统适用于该语言。因此会忽略script子标签。例如，yi取代了yi-Hebr ，因为意地绪语总是使用希伯来字母书写。
另一个例子，zh-Hans-SG可被认为等价于zh-Hans，因为新加坡简体中文与其他简体中文几乎一样。但是，这里的script子标签显然是有意义的。

ISO 3166-1 与 UN M.49

当语言的地区方言有专门的子标签，这比使用地区子标签更优。例如，ar-DZ应该被arq代替来表示阿尔及利亚阿拉伯语。

扩展

Extension子标签（不要与extended语言子标签混淆）允许附加额外的信息，如locale，calendar，currency。
至2014年1月已经分配了两种扩展。

Extension T

2012年2月，Unicode Consortium在RFC 6497发布了Extension T用于语言标签包含信息关于音译（transliterated），转写（transcribed），变换（transformed）。例如，en-t-jp用于从日语翻译到英语。

Windows操作系统的使用

Windows Vista及以后版本，采用RFC 4646作为locale标签，字符串最大长度85，包含了结尾的零字符。 
只有语言子标签，称为中立locale（neutral locale）。加上地区子标签，称为specific locale。格式为<language>-<Script>-<REGION>，例如"uz-Latn-UZ"表示乌兹别克斯坦的使用拉丁字母的乌兹别克语。
排序规则应写为<language>-<Script>-<REGION>_<sort order>