本文要点

  • 国内地址最后一行放城市、两位省代码和邮编
  • Postal Code 使用字母数字交替的 A1A 1A1 形式
  • 中间使用空格而不是连字符
  • 法语重音字符和长地名不能被前端清理掉
作者
Random Address Generator 编辑团队
审核
国际地址格式审核组
最近实质更新
根据 Canada Post 官方 addressing guidelines 核对邮编空格、省缩写和最后一行格式。

加拿大地址的实际行结构

一个常见的加拿大地址依次是收件人、单元与街道、城市或 municipality、省与 Postal Code。加拿大国内邮件通常不需要最后再写 CANADA,从其他国家寄送时才在最后一行加上国家名。

Canada Post 建议 municipality、省或地区缩写与邮编位于同一行。这个规则适合转化为截图测试和 PDF 标签测试,但数据库仍应分字段保存。

格式示例
Amélie RoySuite 310, 88 King Street WestTORONTO ON M5V 3A8CANADA

表单字段如何映射

前端可以展示全称 Ontario,但 API 提交值应与后端约定保持一致,例如 ON。不要用 CA 代替省值:CA 是常用国家代码,而加拿大的省需要各自两位缩写。

字段示例存储建议
Address Line 188 King Street West保留用户原始拼写
Address Line 2Suite 310可选,允许 Unit、Apt 和 Suite
City / MunicipalityToronto使用 Unicode 字符串
ProvinceON两位省或地区代码
Postal CodeM5V 3A8大写、中间一个空格
CountryCA与省代码分开

Postal Code 的验证和归一化

加拿大邮编为六个字符,字母与数字交替,第三与第四个字符之间使用一个空格。界面可接受小写或无空格输入,再在离开字段时归一化,但不应用连字符作为标准输出。

正则通过只表示形式合法。真实服务中如果需要核对城市和邮编,必须使用可靠的邮政数据源。

function normalizeCanadianPostalCode(value) {
  const compact = value.trim().toUpperCase().replace(/\s+/g, '');
  return compact.length === 6 ? `${compact.slice(0, 3)} ${compact.slice(3)}` : value.trim();
}

双语和 Unicode 不是可选功能

魁北克等地的人名、街道名和市镇可以包含重音字符。如果系统在验证时只保留 ASCII,就会在尚未进行邮政校验之前破坏数据。

回归用例至少要包含重音字符、连字姓氏、长 municipality 和空 Address Line 2,并检查 CSV 导出再导入后字符不变。

  • 保持 UTF-8 导入导出
  • 不要静默删除重音符号
  • 分开测试展示标签和 API 代码
  • 对长地名做移动端换行测试

格式测试与投递核验的边界

合成地址适合测试字段长度、省下拉框、邮编提示和导出格式,但不证明街道与门牌组合存在。配送流程必须单独调用授权服务或让用户确认。

从用户输入到打印标签的审核流程

先使用一条包含重音字符、Suite 和小写邮编的记录。用户输入时保留原值,离开 Postal Code 字段后生成大写且带空格的归一化值。这两个值都应在调试模式中可见,以免后端编码问题被前端正常显示掩盖。

然后切换省份,检查 municipality 建议和 Postal Code 规则是否一起重置。最后打印国内与国际两种标签:国内版不额外填 CANADA,国际版将国家名单独放在底部。测试要比较实际生成的 PDF 或图片,因为 HTML 预览正确不代表打印字体不会丢失重音字符。

  • 用 Montréal 和带重音的人名验证 Unicode
  • 断言用户原值与归一化邮编均可追踪
  • 修改国家后不沿用加拿大正则
  • 验证国内与国际标签的国家行差异

常见问题

加拿大 Postal Code 中间用空格还是连字符?

标准展示使用一个空格,例如 M5V 3A8,不使用连字符。

省字段应存 Ontario 还是 ON?

取决于 API 契约。常见做法是展示 Ontario、提交 ON,并在后端保留明确枚举映射。

通过邮编正则就可以发货吗?

不可以。正则只检查格式,发货前还需要确认完整地址与投递服务。

来源与进一步阅读

  1. Canada Post:地址编写重要说明
  2. MDN:HTML autocomplete 地址字段