Меню

Формат адреса по странам: как отличаются записи

Формат адреса по странам различается порядком частей, составом полей и видом индекса. Разбираем национальные схемы, компромисс универсальных строк и проектирование модели полей для многих стран.

Опубликовано

  • тестовые данные
  • адреса
  • страны

Формат адреса по странам различается настолько, что попытка описать все случаи одной формой почти всегда заканчивается компромиссом. Где-то запись начинается с крупной единицы и заканчивается номером дома, где-то наоборот; где-то индекс состоит из цифр фиксированной длины, где-то содержит буквы, а где-то его нет вовсе. Разработчику, который делает международную форму, приходится выбирать между точностью и простотой, и от этого выбора зависит, сколько дефектов останется незамеченными. Дальше разберём, как устроены национальные схемы, чем плохи универсальные строки адреса и как спроектировать модель полей, которую можно проверить тестами. В конце вы получите практический набор решений для формы, работающей более чем с одной страной.

Почему адрес нельзя описать одним набором полей

Адрес описывает путь к двери, и страны выбирают разный порядок этого пути. В одних культурах принято идти от общего к частному: сначала страна, регион, город, затем улица и номер. В других — от частного к общему: сначала номер дома и улица, затем город и регион. Оба подхода логичны, и оба закреплены в почтовых правилах, поэтому форма должна поддерживать как минимум два порядка.

Второе различие — состав уровней. В одной стране между городом и улицей есть только район, в другой добавляется квартал и микрорайон, в третьей существует два уровня административных единиц с собственными названиями. Универсальное поле «регион» для таких случаев слишком грубо: оно либо теряет информацию, либо вынуждает хранить в нём склеенное значение.

Третье различие — обязательность. Поле, без которого невозможно доставить письмо в одной стране, в другой не существует как понятие. Требовать его везде — значит отвергать корректные адреса; не требовать нигде — значит пропускать неполные.

Четвёртое различие — алфавит и направление письма. Некоторые языки пишут справа налево, некоторые используют иероглифы, некоторые требуют сохранения диакритических знаков. Всё это влияет и на хранение, и на отображение, и на поиск. Общий обзор международных схем есть в статье про международный формат адреса.

В каком порядке записывают адрес в разных странах?

В Японии и Китае принят порядок от крупного к мелкому. Запись начинается с самой большой единицы и последовательно сужается до номера здания, причём в Японии районы и кварталы часто нумеруются, а не называются. Человек, привыкший к европейской записи, читает такую строку с конца, и именно поэтому автоматическое определение полей даёт ошибки.

В Соединённых Штатах, Великобритании и большинстве европейских стран принят обратный порядок: сначала номер дома и улица, затем город, затем регион и индекс. Различия внутри этой группы тоже есть — например, в Великобритании индекс содержит буквы и стоит ближе к концу строки, а название города может отсутствовать в коротком варианте записи.

В Турции используется гибридная схема: строка начинается с мелких единиц, квартала и улицы, затем идёт почтовый индекс, после него район, а замыкает строку провинция. Это отличается и от американского порядка, где регион предшествует индексу, и от восточноазиатского. Форма, которая определяет регион по позиции в строке, на турецких адресах ошибётся.

В латиноамериканских странах встречается многоуровневая структура: между городом и улицей добавляются районы и зоны, а индекс иногда обслуживает целую область, а не конкретный квартал. В некоторых странах региона два уровня, и оба важны для доставки.

Отсюда практический вывод: не полагайтесь на порядок как на признак типа поля. Определяйте поля по содержимому и по справочникам, а порядок для вывода берите из описания страны.

Какие бывают почтовые индексы

Первый тип — числовой индекс фиксированной длины. Он характерен для многих стран, и длина у каждого своя: где-то пять знаков, где-то шесть, где-то десять. Ведущие нули значимы, и это отдельная ловушка для полей числового типа.

Второй тип — буквенно-цифровой индекс. Он содержит буквы и цифры в определённом порядке и допускает проверку по шаблону, но шаблон этот у каждой страны свой. Буквы могут кодировать область, а цифры — участок внутри неё.

Третий тип — индекс с уточнением. Основная часть указывает зону, а дополнительная сужает её до конкретного участка. Дополнительная часть необязательна, и форма должна принимать оба варианта, а не требовать полного.

Четвёртый тип — отсутствие индекса как обязательного поля. В таких странах адрес строится по названиям населённых пунктов и районов, а поле индекса либо не используется, либо имеет свободный формат. Форма, которая требует индекс везде, отсечёт часть корректных адресов. Подробный разбор типов приведён в статье про форматы почтовых индексов.

Почему одни поля обязательны, а других не существует?

Обязательность поля определяется почтовыми правилами страны, а не удобством базы данных. Если для доставки достаточно города и улицы, требовать ещё и регион незачем — пользователь потратит время, а форма получит значение, которое он придумает. Если же регион решает, в какой сортировочный центр попадёт письмо, без него адрес неполон.

Второй источник различий — административное устройство. В стране может не быть промежуточного уровня между городом и центром, и тогда соответствующее поле не имеет смысла. Может быть наоборот: уровней больше, чем помещается в форму, и часть из них приходится склеивать в одно поле.

Третье — наличие особых территорий. Острова, заморские владения и военные адреса часто обслуживаются отдельно и используют собственные обозначения. Если форма хочет их поддерживать, справочник кодов должен включать эти значения; если не хочет — ограничение стоит выразить явно.

Четвёртое — язык. Названия административных единиц существуют в официальном варианте и в переводе, и в формах встречаются оба. Хранить стоит исходное значение, а перевод показывать, иначе поиск и сортировка будут работать непредсказуемо. О кодах стран и их административных единиц рассказано в материале про коды стран и регионов.

Чем плохи универсальные строки адреса?

Универсальная схема из двух или трёх свободных строк плюс город, регион и индекс — самый распространённый компромисс в международных формах. Он прост в реализации, легко принимает любую страну и не требует справочников. Именно поэтому он так популярен.

Цена этой простоты проявляется постепенно. Во-первых, без справочников нельзя проверить согласованность: город и индекс могут относиться к разным регионам, и форма этого не заметит. Во-вторых, невозможно предложить зависимые списки: пользователь вводит всё вручную и ошибается чаще.

В-третьих, страдает сортировка и отчётность. Если в свободной строке лежит склеенный адрес, извлечь из него город для отчёта можно только разбором текста, а разбор ошибается на нестандартных записях. В-четвёртых, ограничения на длину строки обрезают длинные адреса, и теряется именно та часть, которая указывает на конкретную дверь.

Полностью отказаться от свободных строк нельзя: остаются страны, для которых у вас нет справочника, и адреса, не помещающиеся в стандартную схему. Разумный подход — использовать свободные строки как запасной вариант, а для поддерживаемых стран включать точную схему. О том, как такие ситуации выглядят в пограничных сценариях, рассказано в статье про адреса при пересечении границ.

Как спроектировать модель полей для многих стран

Первый шаг — разделить хранение и отображение. В базе полезно держать отдельные поля для каждой смысловой части там, где это возможно, а строку для печати собирать из них по правилам страны. Тогда поиск и отчёты работают по полям, а не по тексту.

Второй шаг — описать каждую страну набором правил: какие поля обязательны, какие допустимы, какие проверки применяются, в каком порядке собирать строку и каким шаблоном проверять индекс. Эти правила удобно держать в данных, а не в коде, потому что они меняются.

Третий шаг — предусмотреть уровень, общий для всех. Обычно это страна, адресная строка или несколько строк, населённый пункт и индекс. Конкретные страны дополняют этот уровень своими полями, а форма показывает их только тогда, когда страна выбрана.

Четвёртый шаг — продумать переходы между странами. Пользователь часто начинает заполнять адрес, а затем меняет страну. Правильное поведение — сохранить то, что ещё применимо, и очистить то, что к новой стране не относится, а не оставлять чужие значения в необязательных полях.

Пятый шаг — зафиксировать набор тестовых адресов для каждой поддерживаемой страны. Такой набор позволяет проверять форму одинаково при каждом изменении и быстро замечать регрессии. Данные по странам собраны в разделе стран, и оттуда удобно брать примеры для проверок.

Откуда брать и как поддерживать данные о странах

Основной источник правил адресации — почтовые администрации, которые публикуют национальные стандарты записи. Международный союз публикует сводные рекомендации и сведения о форматах, и его материалы полезны как отправная точка: Всемирный почтовый союз описывает общие принципы для международных отправлений.

Второй источник — официальные перечни административных единиц и почтовых индексов. Их стоит брать у национальных ведомств, потому что посредники обновляют данные с задержкой и иногда искажают названия. Третий — стандарты кодов стран и регионов, которые дают устойчивые идентификаторы вместо названий.

Поддержка — отдельная задача. Границы регионов меняются, индексы добавляются, названия переименовываются. Значит, справочник нуждается в периодическом обновлении, а в описании данных стоит фиксировать, на какую дату они актуальны. Полезно хранить версию справочника и проверять, что тесты используют ту же версию, что и рабочее окружение.

Как поддерживать набор в актуальном состоянии?

Данные о странах стареют, и это происходит тише, чем кажется. Меняются почтовые индексы, появляются новые административные единицы, уточняются правила записи. Если набор собран один раз и больше не пересматривается, он постепенно расходится с действительностью, а тесты начинают подтверждать поведение, которого в реальности уже нет.

Разумный порядок работы — привязать пересборку набора к обновлению справочников, а не к календарю. Когда справочник страны меняется, набор пересобирается и прогоняется заново; если изменений нет, пересборка не нужна. Так внимание тратится на те страны, где что-то действительно произошло, а не распределяется равномерно по всем.

Полезно также хранить рядом с набором короткое описание источника и даты, по состоянию на которую данные собраны. Без этого через полгода невозможно понять, устарел набор или в нём изначально была неточность.

Границы тестовых адресов

Адреса, которые выдаёт генератор данных о странах, синтетические. Они построены по правилам выбранной страны и согласованы между собой, но за ними не стоит ни одно реальное здание и ни один реальный человек.

Практически это значит, что такие записи нельзя использовать для отправки корреспонденции, нельзя предъявлять как подтверждение места жительства и нельзя применять, чтобы выдать себя за другого. Назначение этих образцов — проверка ваших собственных форм, справочников, правил нормализации и тестовых окружений.

Что делать дальше

Составьте список стран, которые ваша форма действительно поддерживает, и для каждой выпишите обязательные поля, правила проверки индекса и порядок сборки строки. Затем сверьте этот список с тем, что реализовано в коде, и посмотрите, где правила расходятся. После этого соберите по одному тестовому адресу на каждую страну и добавьте два негативных случая: адрес с чужим индексом и адрес, в котором заполнено поле, не существующее для этой страны. Такой набор закрывает большую часть ошибок, которые иначе всплывают уже на живых пользователях.

Читать дальше

Популярные инструменты и статьи о применении