本文要点
- 国内地址最后一行放城市、两位省代码和邮编
- Postal Code 使用字母数字交替的 A1A 1A1 形式
- 中间使用空格而不是连字符
- 法语重音字符和长地名不能被前端清理掉
作者与审核
查看编辑与审核原则- 作者
- Random Address Generator 编辑团队
- 审核
- 国际地址格式审核组
- 最近实质更新
- 根据 Canada Post 官方 addressing guidelines 核对邮编空格、省缩写和最后一行格式。
加拿大地址的实际行结构
一个常见的加拿大地址依次是收件人、单元与街道、城市或 municipality、省与 Postal Code。加拿大国内邮件通常不需要最后再写 CANADA,从其他国家寄送时才在最后一行加上国家名。
Canada Post 建议 municipality、省或地区缩写与邮编位于同一行。这个规则适合转化为截图测试和 PDF 标签测试,但数据库仍应分字段保存。
表单字段如何映射
前端可以展示全称 Ontario,但 API 提交值应与后端约定保持一致,例如 ON。不要用 CA 代替省值:CA 是常用国家代码,而加拿大的省需要各自两位缩写。
| 字段 | 示例 | 存储建议 |
|---|---|---|
| Address Line 1 | 88 King Street West | 保留用户原始拼写 |
| Address Line 2 | Suite 310 | 可选,允许 Unit、Apt 和 Suite |
| City / Municipality | Toronto | 使用 Unicode 字符串 |
| Province | ON | 两位省或地区代码 |
| Postal Code | M5V 3A8 | 大写、中间一个空格 |
| Country | CA | 与省代码分开 |
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,并在后端保留明确枚举映射。
通过邮编正则就可以发货吗?
不可以。正则只检查格式,发货前还需要确认完整地址与投递服务。
