国家/地区代码对照表

ISO 3166-1 国家/地区代码:Alpha-2、Alpha-3、数字码与电话区号对照,覆盖中国及主要国家与地区。

原理解析

ISO 3166 为国家和地区分配标准代码:两位字母(如 CN、US)、三位字母(CHN、USA)和三位数字(156、840)。它们在数据交换中比中文/英文全称更稳定、更短。

两位代码用于国际域名后缀(.cn/.us,即 ccTLD)、电话国际区号前缀、物流与海关申报。注意它与电话区号、货币代码是三套独立体系,不能混用。

什么时候该查这张表

这张表在你要把国家名、二字母代码、三字母代码和数字代码互转时有用。这四套标识在现实系统中同时存在:ISO 3166-1 alpha-2 用于域名与代码,alpha-3 用于数据库与统计,numeric 用于国旗 emoji 与遗留系统。选错套会静默失败——同样是 "CN",写错成数字代码 156 不会被任何校验拦住。

不该查的情况:你在做地理分区判断。「国家」「地区」「大陆」不是一回事:ISO 把中国列为 CN,但台湾、香港、澳门在 ISO 中各有独立条目;欧盟成员国不等于欧洲。若业务逻辑需要这种区分,本表不提供,标准做法是使用成熟的地区数据集。

判断标准:接口约定用 alpha-2(最短、通用),数据存储与交换用 alpha-3(更少冲突),国旗与展示用 numeric 或 emoji。关键是不要在同一系统里混用两套而不记录映射。

特别注意:alpha-2 代码与顶级域名不完全一致,且历史上有过变更(如 ZR 对应刚果金,DD 对应东德)。这些遗留代码在老系统中仍然存在,处理外部数据时需要兼容而不是纠正。

边界与常见陷阱

  • 同名不同码:代码必须以 ISO 为准而非名称

    存在多组同为国家名、不同代码的条目,也存在代码相同而官方名变化的情况(如 Turkey 的官方名 Türkiye、Czechia 的历史名 Czech Republic)。以名称做主键的国家列表在改版后必然对不上;以代码为键则稳定。存名称时把 ISO 官方英文名作为快照字段另存,不要用它做主键。

  • 国旗 emoji 的 regional indicator 只认 alpha-2

    把两个 ISO 3166-1 alpha-2 码位拼起来即可得到国旗 emoji(U+1F1E6 起为 A)。用 alpha-3 或数字代码无法生成,常见做法是先用数字代码经 String.fromCodePoint(127397 + n) 转为 alpha-2 再拼接。另一个坑是国旗在 Windows 上可能整体渲染成两个字母,这是平台字体缺失,不是编码错误。

  • ISO 3166-1 与 UN M49 不是同一套数字

    统计与人口数据常用 UN M49,其区域与次区域代码与 ISO 3166-1 数字代码大体对应但用途不同,且 M49 另有 Area/Territory 层级。混用两套数字会在跨境数据聚合时产生看似合理实则错位的分组。接口设计时应明确声明用的是哪一套,并在字段名中标注。

与相邻内容的分工

要查货币代码(ISO 4217),用站内「货币代码」页;货币与国家代码有关联但不是一回事,不能互相替代。

要查语言代码(ISO 639 / BCP 47),用站内「语言代码」页;国家不等于语言,一国多语言很常见。

要判断国旗、时区、拨号码等与地区相关的属性,应使用专门数据集,本表只覆盖 ISO 3166-1 的三套代码。

若目的是把国家名做下拉选择或搜索,需要多语言名称数据集,本表的单一官方名不足以支撑。

实战片段

要点:① 国旗 emoji 只能由 alpha-2 生成,数字代码须先经 127397 + n 转成字母;② Windows 可能把国旗渲染成两个字母,这是平台字体缺失而非编码错误,生产环境建议用 SVG 资源而非依赖 emoji 字体;③ 下拉与存储的主键必须用代码而非国家名,官方名会变(Türkiye、Czechia),以名为键的列表在 ISO 改版后必然对不上。

// 数字代码 → alpha-2 → 国旗 emoji
function numericToAlpha2(numeric: number): string {
  // UN M49 / ISO 3166-1 numeric 转 alpha-2:127397 是 'A' 的 regional indicator 码位
  return String.fromCodePoint(127397 + numeric)
}

function flagOf(alpha2: string): string {
  if (alpha2.length !== 2) throw new Error('flag needs alpha-2')
  const base = 0x1f1e6 // 'A' 的 regional indicator
  return String.fromCodePoint(
    base + (alpha2.toUpperCase().charCodeAt(0) - 65),
    base + (alpha2.toUpperCase().charCodeAt(1) - 65),
  )
}

console.log(numericToAlpha2(156))            // CN
console.log(flagOf('cn'))                  // 🇨🇳
console.log(flagOf('de'), flagOf('jp'))     // 🇩🇪 🇯🇵

// ⚠ Windows 上可能渲染成 "CN" 两个字母 —— 平台字体缺失,不是编码错误
// 生产环境应改用 <img src=".../cn.svg">,避免依赖 emoji 字体

// 下拉框的稳定主键:用 alpha-2,不要用国家名(会随 ISO 改版变化)
const options = [
  { code: 'CN', name: 'China' },
  { code: 'DE', name: 'Germany' },
]

实践注解

  • ISO 3166-1 有 alpha-2、alpha-3、数字三套并存中国是 CN / CHN / 156。混用会出错(CH 是瑞士不是中国,CN 与 CHN 不能互换)。系统内部只选一套作为规范,其它形态在边界处转换,否则筛选取交集会静默丢数据。
  • 「国家」与「地区」在数据模型上是同一种实体ISO 3166-1 里既有主权国家也有属地(如 HK、TW 作为地区代码)。业务表若叫 country 却要装地区,字段命名与文档需说明口径,避免统计口径争议。
  • 电话区号与国家代码不是一回事+1 覆盖美国、加拿大与多个加勒比地区,+7 覆盖俄罗斯与哈萨克斯坦。用「国家代码 → 区号」做一对一映射一定出错,电话号码解析应使用 libphonenumber 这类带元数据的库。

数据来源

  • ISO 3166-1 (alpha-2 / alpha-3 / numeric)
  • ITU-T E.164

上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。

国家/地区Alpha-2Alpha-3数字码电话区号
中国CNCHN156+86
中国香港HKHKG344+852
中国澳门MOMAC446+853
中国台湾TWTWN158+886
美国USUSA840+1
英国GBGBR826+44
日本JPJPN392+81
韩国KRKOR410+82
德国DEDEU276+49
法国FRFRA250+33
俄罗斯RURUS643+7
加拿大CACAN124+1
澳大利亚AUAUS036+61
巴西BRBRA076+55
印度ININD356+91
意大利ITITA380+39
西班牙ESESP724+34
荷兰NLNLD528+31
新加坡SGSGP702+65
瑞士CHCHE756+41

常见问题

ISO 3166-1 的 Alpha-2 和 Alpha-3 有什么区别?

两者都是国家/地区的两字母与三字母代码,指向同一实体。Alpha-2(如 CN)更短、常用于域名后缀与数据交换;Alpha-3(如 CHN)可读性更好、不易与地区缩写混淆。数字码(如 156)与字母无关,适合不用拉丁字母的系统。

电话区号前面的 + 是什么?

"+" 表示国际接入前缀,后接国家代码(如 +86)。实际拨打时 "+" 会被替换成本地国际前缀(中国为 00,美国为 011),例如 +86 138... 从中国境外拨为 0086 138...。

为什么美国和加拿大都用 +1?

北美号码计划(NANP)把美国、加拿大及部分加勒比地区统一编入 +1 区,区号内再用三位地区码区分。所以电话区号 +1 是共享的,不能唯一确定国家。

字母码或数字码会变吗?

极少变化,但确有先例:例如前南斯拉夫解体后新增多个国家代码,苏丹拆分出南苏丹。正式清单由 ISO 维护,必要时以最新版为准。