Меню

ISO 3166: коды стран и почему нельзя придумывать свои

ISO 3166 даёт каждой стране три разных кода, а её регионам — код второго уровня. Разбираем, зачем они нужны и как их не перепутать.

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

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

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

Зачем одной стране три разных кода

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

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

Третий вариант — числовой. Его главное достоинство в том, что он не зависит от письменности: цифры одинаково выглядят в любой стране и не требуют правильной раскладки. Кроме того, к опечаткам в написании букв такой код нечувствителен вовсе, потому что букв в нём нет.

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

Что происходит при смешивании кодов

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

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

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

Как устроены коды регионов

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

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

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

Что за код Кто ведёт Для чего обычно служит
Код страны международный стандарт идентификация страны при обмене данными
Код региона по стандарту тот же стандарт идентификация области, штата, префектуры
Местный код региона ведомство страны отчётность, налоги, почтовая сортировка

Можно ли добавить свой код для новой страны?

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

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

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

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

Мир меняется: появляются новые государства и территории, меняются названия, какие-то коды перестают действовать. Поэтому список стран — не константа, а то, что время от времени обновляется.

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

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

Как это выглядит в нашем генераторе

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

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

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

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

Что важно разработчику

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

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

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

Четвёртое: проверяйте пары «страна и регион» вместе. Как это связано с проверкой адреса целиком, разобрано в статье про проверку и нормализацию, а как выглядит порядок полей — в материале о формате международного адреса.

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

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

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

Статьи: Генератор фальшивых адресов