Skip to content

作为一名开发者,你是否曾被这些名目繁多的代码搞得晕头转向?

  • 用户注册时,国家列表里是 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。更具可读性,常用于数据统计和官方文档。

开发者实战指南:

  • 数据库设计:在用户表中存储国家时,创建一个 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)


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的延伸,目标是涵盖所有的语言个别语言的超集合。

深入了解 (Learn More)


3. 精准本地化:我在什么地方,说什么话?- Locale

现在,我们将前两者结合,回答一个更精确的问题:“用户在特定地区使用的特定语言是什么?” 这就是区域设置 (Locale) 的概念。

  • 标准名称:无单一标准,通常遵循 IETF BCP 47 规范,组合了 ISO 639ISO 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)


4. 专业领域与特殊情况:字幕、多媒体与 T/B 码 - ISO 639-2

为什么视频字幕不直接用 zhen 呢?因为专业领域需要更广泛的语言覆盖,而这也正是“一语多码”问题的根源。

  • 标准名称ISO 639-2 (三位字母码)

  • 关键知识点:T/B 码 (Terminology/Bibliographic Codes) 大约有20多种语言在 ISO 639-2 中拥有两个三位代码,这源于历史原因:

    • B 码 (Bibliographic):源于英文名称,主要用于图书馆编目,是历史遗留产物。例如,German -> ger
    • T 码 (Terminology):源于该语言的本地名称,是现代计算机应用中推荐使用的代码。例如,Deutsch -> deu

    最常见的例子就是中文:

    • chiB 码 (来自 Chinese)。
    • zhoT 码 (来自 中文, Zhōngwén)。
语言英文名本地名B 码 (旧/编目)T 码 (新/术语)推荐使用
中文Chinese中文chizhozho
德语GermanDeutschgerdeudeu
法语FrenchFrançaisfrefrafra
藏语Tibetanབོད་ཡིགtibbodbod

开发者实战指南:

  • 黄金法则优先使用 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)


快速参考备忘录

任务场景我需要什么?使用标准示例代码开发者关键点
选择国家唯一标识一个国家ISO 3166-1 alpha-2CN, US数据库 CHAR(2) 存储,API 参数
网页或简单翻译标识一种主要语言ISO 639-1zh, enHTML lang 属性,i18n 基础
精确本地化区分语言的地区变体IETF BCP 47zh-CN, en-USi18n 文件夹命名,HTTP 请求头,格式化
字幕/音轨标记覆盖尽可能多的语言ISO 639-2zho (推荐)优先用 T 码,兼容 B 码
处理本地时间精确计算时间与夏令时IANA Time Zone DBAsia/Shanghai服务器存 UTC,客户端用 IANA 标识转换

现在,迷雾已散。这些代码并非混乱的产物,而是一套设计精良、分工明确的系统。掌握它们,你将能:

  1. 建立清晰的心智模型:理解每个代码的适用场景,并洞悉 zho/chi 等特殊情况的历史原因。
  2. 写出更健壮的代码:优雅处理全球用户需求,同时兼容旧数据。
  3. 高效协作:用精准术语与团队沟通。

参考链接