作为一名开发者,你是否曾被这些名目繁多的代码搞得晕头转向?
- 用户注册时,国家列表里是
CN
还是CHN
? - 做多语言翻译(i18n)时,文件夹是该命名为
zh
还是zh-CN
? - 处理视频字幕时,规范要求一个陌生的三位码,有时是
zho
,有时又是chi
,它们到底有什么区别? - 更别提
Asia/Shanghai
这种看似毫无规律的时区标识了。
读完它,你将彻底理解这些代码背后的逻辑,并能自信地在你的项目中正确使用它们。
核心思想:分而治之
这些标准之所以看起来混乱,是因为我们试图用一个模糊的“地区”概念去理解它们。但计算机世界的原则是精确。因此,国际标准组织将“地区”这个模糊概念 “分而治之”,拆解成了几个具体、正交(互不依赖)的维度,并为每个维度都设立了黄金标准。
我们的探索之旅,就从理解这几个维度开始。
1. 地理位置:我在哪里?- ISO 3166-1
这是所有代码的基础,它回答一个最简单的问题:“这个国家/地区是什么?”
- 标准名称:ISO 3166-1
- 核心任务:为全球的国家和地区提供唯一的身份标识。
- 主要形式:
- alpha-2 (两位字母码):如
US
,CN
,JP
。这是最常用、最通用的形式。 - alpha-3 (三位字母码):如
USA
,CHN
,JPN
。更具可读性,常用于数据统计和官方文档。
- alpha-2 (两位字母码):如
开发者实战指南:
- 数据库设计:在用户表中存储国家时,创建一个
country_code
字段,使用CHAR(2)
类型存储两位码 (alpha-2
)。例如:
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
country_code CHAR(2)
);
- API 设计:地区相关的 API(如电商配送范围)应使用两位码作为参数,例如:
http
GET /api/v1/shipping?country=CN HTTP/1.1
- 前端开发:国家选择下拉框中,
<option value="CN">中国</option>
的value
应该使用两位码。例如:
html
<select name="country">
<option value="CN">中国</option>
<option value="US">美国</option>
<option value="JP">日本</option>
</select>
深入了解 (Learn More)
- 维基百科: ISO 3166-1
- 官方标准查询: ISO Online Browsing Platform
2. 语言:我说什么话?- ISO 639
这个标准只关心一件事:我们正在使用的是哪一种语言?
- 标准名称:ISO 639
- 核心任务:为世界上的语言进行编码。
- 主要形式:
- ISO 639-1 (两位字母码):如
en
,zh
,ja
。它覆盖了约184种世界主要语言,按惯例使用小写。 - ISO 639-2 (三位字母码,分T和B两类):如
eng
,zho
,jpn
。它覆盖了超过500种语言,解决了两位码覆盖不足的问题。 - ISO 639-3 (三位字母码):如
eng
,zho
,jpn
。ISO 639-3是ISO 639-2的延伸,目标是涵盖所有的语言个别语言的超集合。
- ISO 639-1 (两位字母码):如
深入了解 (Learn More)
3. 精准本地化:我在什么地方,说什么话?- Locale
现在,我们将前两者结合,回答一个更精确的问题:“用户在特定地区使用的特定语言是什么?” 这就是区域设置 (Locale) 的概念。
- 标准名称:无单一标准,通常遵循 IETF BCP 47 规范,组合了
ISO 639
和ISO 3166-1
。 - 核心任务:精确描述语言在特定地区的变体,以处理拼写、用词、日期格式、货币符号等差异。
- 格式:
语言代码-国家代码
(language-COUNTRY)en-US
:在美国使用的英语。en-GB
:在英国使用的英语。zh-CN
:在中国大陆使用的中文(特指简体)。zh-TW
:在中国台湾使用的中文(特指繁体)。
开发者实战指南:
- 软件国际化 (i18n):你的资源文件(如翻译字符串)应放在以 Locale 命名的文件夹中,如
values-zh-CN/strings.xml
(Android)。例如:
res/
values/
strings.xml
values-zh-CN/
strings.xml
- HTTP 请求头:解析
Accept-Language: zh-CN,zh;q=0.9
请求头,为用户返回最合适的语言版本。例如:
http
Accept-Language: zh-CN,zh;q=0.9
- 日期/货币格式化:所有现代编程语言的库都接受 Locale 作为参数。例如在 Java 中:
java
Locale locale = new Locale("zh", "CN");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
String dateStr = dateFormat.format(new Date());
深入了解 (Learn More)
- 维基百科: IETF 语言标签
- 官方标准定义 (BCP 47): IETF Tools - BCP 47
4. 专业领域与特殊情况:字幕、多媒体与 T/B
码 - ISO 639-2
为什么视频字幕不直接用 zh
或 en
呢?因为专业领域需要更广泛的语言覆盖,而这也正是“一语多码”问题的根源。
标准名称:ISO 639-2 (三位字母码)
关键知识点:T/B 码 (Terminology/Bibliographic Codes) 大约有20多种语言在
ISO 639-2
中拥有两个三位代码,这源于历史原因:- B 码 (Bibliographic):源于英文名称,主要用于图书馆编目,是历史遗留产物。例如,
German
->ger
。 - T 码 (Terminology):源于该语言的本地名称,是现代计算机应用中推荐使用的代码。例如,
Deutsch
->deu
。
最常见的例子就是中文:
chi
是 B 码 (来自 Chinese)。zho
是 T 码 (来自 中文, Zhōngwén)。
- B 码 (Bibliographic):源于英文名称,主要用于图书馆编目,是历史遗留产物。例如,
语言 | 英文名 | 本地名 | B 码 (旧/编目) | T 码 (新/术语) | 推荐使用 |
---|---|---|---|---|---|
中文 | Chinese | 中文 | chi | zho | zho |
德语 | German | Deutsch | ger | deu | deu |
法语 | French | Français | fre | fra | fra |
藏语 | Tibetan | བོད་ཡིག | tib | bod | bod |
开发者实战指南:
- 黄金法则:优先使用 T 码! 它是为技术应用设计的。但在处理旧系统或外部数据时,你的代码需要具备兼容性,能够同时识别 T 码和 B 码。
- 媒体处理:使用 FFmpeg 时,应使用 T 码。例如:
bash
ffmpeg -i input.mp4 -metadata:s:s:0 language=zho output.mp4
- 数据清洗:从外部源接收数据时,可以用映射函数统一代码。例如在 Python 中:
python
language_map = {
"chi": "zho",
"ger": "deu",
"fre": "fra",
"tib": "bod",
}
def normalize_language_code(code):
return language_map.get(code, code)
5. 终极挑战:时间和时区 - IANA Time Zone Database
为什么不能用国家代码 US
表示美国时间?因为美国本土有4个时区,还涉及复杂的夏令时规则。
- 标准名称:IANA Time Zone Database (也称 tz database 或 Olson database)
- 核心任务:精确定义全球所有时区的边界、与 UTC 的偏移量,以及所有历史上的夏令时变更规则。
- 格式:
大洲/代表性城市
(Area/Location)Asia/Shanghai
America/New_York
Europe/London
开发者实战指南:
- 黄金法则:永远不要自己计算时区或夏令时!
- 后端开发:在服务器上,所有时间都应以 UTC 存储,转换为本地时间时使用 IANA 标识。例如在 Java 中:
java
Instant instant = Instant.now();
String timestamp = instant.toString();
- 前端开发:浏览器 API 可获取用户时区。例如在 JavaScript 中:
javascript
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
深入了解 (Learn More)
- 维基百科: tz database
- 官方数据源: IANA Time Zones
快速参考备忘录
任务场景 | 我需要什么? | 使用标准 | 示例代码 | 开发者关键点 |
---|---|---|---|---|
选择国家 | 唯一标识一个国家 | ISO 3166-1 alpha-2 | CN , US | 数据库 CHAR(2) 存储,API 参数 |
网页或简单翻译 | 标识一种主要语言 | ISO 639-1 | zh , en | HTML lang 属性,i18n 基础 |
精确本地化 | 区分语言的地区变体 | IETF BCP 47 | zh-CN , en-US | i18n 文件夹命名,HTTP 请求头,格式化 |
字幕/音轨标记 | 覆盖尽可能多的语言 | ISO 639-2 | zho (推荐) | 优先用 T 码,兼容 B 码 |
处理本地时间 | 精确计算时间与夏令时 | IANA Time Zone DB | Asia/Shanghai | 服务器存 UTC,客户端用 IANA 标识转换 |
现在,迷雾已散。这些代码并非混乱的产物,而是一套设计精良、分工明确的系统。掌握它们,你将能:
- 建立清晰的心智模型:理解每个代码的适用场景,并洞悉
zho/chi
等特殊情况的历史原因。 - 写出更健壮的代码:优雅处理全球用户需求,同时兼容旧数据。
- 高效协作:用精准术语与团队沟通。
参考链接
- ISO 3166-1: 维基百科 | ISO Online Browsing Platform
- ISO 639: 维基百科 | 美国国会图书馆
- IETF BCP 47: 维基百科 | IETF Tools - BCP 47
- IANA Time Zone Database: 维基百科 | IANA Time Zones