地址和电话是最容易被当成「一个字符串」处理的两类字段。只面向单一国家时这么想问题不大,一旦要做多语言、多地区,格式差异会直接变成校验失败、错误的地图标记和发不出去的包裹。这份清单按差异点整理,用来检查表单、校验规则和数据库字段宽度。
地址行的顺序为什么会卡住解析
地址是从大到小写还是从小到大写,各国不统一。中国、日本、韩国与台湾地区的习惯是从大到小:国家、省或都道府县、市、区、街道、门牌。美国、英国、德国、法国、澳大利亚则相反,门牌号在最前,城市、州或省、邮编依次往后。
这件事对国际化的影响不在展示,而在解析。如果地址输入框只有一个自由文本域,代码又按固定顺序期望「第一行是城市」,欧美用户的输入一定会错位。测试时至少要准备两种顺序的样本,确认系统不会把门牌号当城市。
还有一个常被忽略的点:国家名本身。同一个国家在不同语言下的写法不同,同一个名字也可能对应多个国家。地址里存的是自由文本还是受控代码,决定了你要测什么。把国家存成受控值的做法,在国际地址格式里有更细的讨论。
邮编的位置和位数差在哪里
邮编在地址里的位置逐国变化。美国放在州名和城市之后,德国和法国放在城市之前,日本放在最前面并常带一个「〒」符号,香港地区与部分中东国家则根本没有邮编这一概念。
规则本身也差得远:有的国家纯数字且位数固定,有的含字母,有的允许空格或连字符,有的在位数上是区间而不是定长。用「六位数字」这类规则去校验所有国家的邮编,会在第一个非中国样本上失败。
测试要点是位数、字符集、是否允许分隔符,以及在地址中的位置。如果系统需要按邮编反查地区,还要额外验证邮编与城市、行政区是否对应;这三者如果来自不同数据来源,很容易造出互相矛盾的记录。可以先用各国邮编格式确认目标国家的规则,避免拿一个不存在的格式去测。
手机号的四个独立问题
号码这一块的差异最大,可以拆成四个互相独立的问题,逐项测才不会漏。
第一,国家代码怎么表示。国际格式通常带加号,本地格式不带。存储时是分开存还是拼在一起,决定了你能否稳定地做归一化。
第二,国内主干前缀是否保留。英国、德国、日本、法国的国内号码常带一个前导零,写国际格式时这个零要去掉;意大利的数字本身就以前导零开头,写国际格式时反而不能去掉。这是国际号码测试里最常见的错误来源,而且本地测试永远发现不了。
第三,位数。各国手机号的位数从八位到十一位不等,固定电话更不统一,有的国家位数本身就是可变的。用统一长度校验会在多数国家上误判。
第四,前缀规则。号码的前几位往往对应运营商或号段区间。前缀不对的号码在只做长度校验的地方能通过,在接入归属查询后会被拒。号码前缀与登记地的关系有多松,电话区号与城市那篇讲得更透。
连写地址与空格分隔该怎么处理
中日韩的地址通常连写,层级之间不加空格,门牌号用一个「号」字或类似标记收尾。西文地址则用空格和逗号分隔,门牌号在最前或最后。
如果表单做了「按空格切分地址」的逻辑,连写地址会整个变成一个词,切分结果完全错误。反过来,如果系统假设地址里没有空格,西文地址会被判为格式非法。
还有罗马化的问题:面向国际用户的表单,地址栏期望的是本国文字还是拉丁转写,两者不能混着校验。测试样本里最好同时包含本国文字和转写两种形式。
每个地区至少该准备哪些样本
- 中国:省市区三级连写、手机号十一位且号段合法、邮编六位。
- 日本:都道府县在前、含「〒」的邮编写法、手机号写国际格式时去掉前导零。
- 韩国:道路名地址与旧的地籍地址两种写法并存。
- 美国:门牌号在最前、州缩写两位、邮编五位数或五位加四位扩展码。
- 德国:街道与门牌号的先后顺序、邮编在城市之前、国内号码前导零在国际格式中的处理。
- 巴西:邮政编码带连字符的写法、长途区号两位。
- 印度:手机号首位范围、地址的英语与本地文字两种写法。
样本不必每条都手工敲。本站的地址生成工具把行政区、城市与邮编绑在同一条记录上,同一个身份标识配上同一个国家,永远产出同一条数据,边界组合也不会出现「城市在广东、省份在四川」这种矛盾。
国际化测试要按什么顺序推进?
先做所有地区共有的宽松检查:非空、长度上限、无非法字符。这一层能挡住绝大部分垃圾输入,而且不会误伤任何国家的合法数据。
再做按地区的严格检查,只在你确实知道规则时才启用。顺序反过来的代价是:合法数据被拒,比非法数据通过更难被发现,因为用户只会默默离开,而不会给你报错日志。
最后才是外观层,也就是地址在页面上的换行与展示顺序。这一层做错不会让订单失败,但会让用户怀疑自己填错了,从而反复修改一个本来正确的地址。
存储格式怎么定才不返工?
地址建议拆字段存:国家代码、一级行政区、城市、邮编、街道、门牌号各占一列,再额外留一个自由文本的原始输入列。拆字段让跨字段校验成为可能,原始输入列则让你在归一化出错时还有据可查。
电话建议存归一化后的形式,通常是国家代码加纯数字,不带空格、连字符和前导零,同时保留用户原始输入。意大利这类例外单独处理。
长度上限要按最坏情况给,而不是按最常见情况给。同一个字段在不同国家的最长写法可能相差一倍以上,列宽按最小国家定,等于把截断留给了别的地区。截断的排查方式见地址表单测试用例。
常见问题
地址真的需要按国家分别校验吗?
如果业务只覆盖一个国家,不需要。一旦出现第二个国家,按统一规则校验就会开始产生误判。折中做法是把校验拆成通用宽松层与逐地区严格层,严格层只在你掌握规则时启用。
邮编长度相同就说明格式对吗?
不一定。位数相同只能说明长度对,字符集可能不对,号段也可能不存在。如果系统有按邮编反查地区的功能,还要验证这个邮编是否真的落在该城市下。长度校验是成本最低的一层,可以先用校验工具把它过一遍,但不要把它当成全部。
号码里带加号还是不带加号?
取决于你把它放在哪一层。界面展示可以按用户的输入习惯保留原样,存储与去重则应当统一成一种不带符号的形式。两种形式的相互转换要专门写用例,因为这是最容易在边界上出错的转换之一。
连写地址怎么做输入提示?
不要试图用空格切分。可行的做法是按层级提供多个输入框,让用户自己选省、市、区,街道和门牌用一个自由文本域收,然后按该地区的拼接规则合成一行展示。测试时要覆盖各层级为空、只有部分层级,以及层级顺序被写反的情况。
本文只讨论格式层面的可测性,不构成对任何国家和地区邮政、电信主管机构现行规则的说明;上线前请以官方发布的最新规则为准,文中的样本均用于测试与演示,不得用于任何真实投递或通信。