Генератор турецких адресов собирает записи, устроенные по правилам турецкой адресной системы: провинция, район, квартал, улица, номер дома и номер квартиры, а в конце пятизначный почтовый индекс. Такие записи нужны тем, кто проверяет формы доставки, регистрации и оплаты для турецкого рынка и не может позволить себе заполнять поля вручную. Сложность здесь не в том, чтобы придумать название улицы, а в том, чтобы все уровни относились к одной провинции и чтобы форма не сломалась на буквах, которых нет в других алфавитах. Дальше разберём устройство иерархии, порядок записи, связь индекса с провинцией и самые коварные ошибки, связанные с турецким регистром букв. В конце вы получите список случаев, которые стоит добавить в собственный набор тестовых данных.
Как устроена турецкая адресная иерархия
Турецкий адрес строится по ступеням, и ступени эти не совпадают с привычными европейскими. Верхняя ступень — il, провинция, которых в стране восемьдесят одна. Внутри провинции выделяется ilçe, район, а внутри района — mahalle, квартал или микрорайон, исторически сложившаяся единица, по которой ориентируются местные жители.
Ниже квартала идёт уровень улицы. Улицы бывают двух типов: sokak, небольшая улица, и cadde, проспект или более крупная магистраль. Оба слова входят в название и различают характер улицы, поэтому при разборе строки их нельзя отбрасывать как служебные. Затем следуют номер здания и номер квартиры внутри здания, и только они указывают на конкретную дверь.
Такая многоуровневая схема важна для формы прежде всего потому, что каждый уровень зависит от предыдущего. Нельзя выбрать квартал, не выбрав сначала район и провинцию: кварталы в разных районах называются по-разному, а одинаковые названия встречаются в нескольких провинциях. Если справочник формы хранит плоский список кварталов, пользователь сможет собрать адрес, которого не существует, и никакая проверка формата этого не заметит. Общий разбор уровней в разных странах есть в материале про форматы адресов.
Второе следствие — неполнота на практике. Многие местные адреса обходятся без явного указания квартала и содержат только улицу, номер дома и район с провинцией, потому что почтальон ориентируется по улице. Форма не должна требовать все уровни одновременно: это отсечёт часть корректных записей и вызовет раздражение у тех, кто знает свой адрес и без квартала.
В каком порядке записывают турецкий адрес?
Порядок записи в Турции гибридный, и именно он чаще всего ломает международные формы. Строка начинается с самой мелкой части: сначала квартал, затем улица, номер дома и номер квартиры. Только после этого идёт почтовый индекс, затем район, а замыкает строку провинция.
Это отличается и от американской схемы, где город предшествует коду штата и индексу, и от восточноазиатской, где запись открывается страной и провинцией. Турецкая запись идёт от частного к общему, но провинция оказывается в самом конце, уже после индекса и района. Форма, которая по привычке ищет код региона в середине строки, разберёт турецкий адрес неправильно.
На конверте внутри страны район и провинцию нередко пишут через косую черту, а индекс ставят перед ними. За границу адрес обычно дополняют названием страны на латинице, но внутренние названия при этом сохраняют свои буквы. Транслитерация без знаков делает запись неотличимой от похожих названий и мешает сортировке.
Практический вывод для теста простой: заведите отдельные случаи для внутренней и международной записи одного и того же адреса. Если форма строит строку сама, сравните результат с тем, как её строит справочник, и проверьте, что перестановка полей не происходит при переключении страны.
Как почтовый индекс связан с провинцией
Турецкий почтовый индекс состоит из пяти цифр и называется posta kodu. Первые две цифры соответствуют номеру провинции в официальном перечне, который совпадает с кодом на автомобильных номерах: чем крупнее провинция, тем меньше её номер. Поэтому индекс не случаен по отношению к провинции — по нему можно проверить, к тому ли региону относится адрес.
Это даёт очень удобный тестовый случай. Возьмите корректный индекс и замените его на индекс из другой провинции, оставив город и район нетронутыми. Если форма принимает такую запись, значит связь полей не проверяется. Обратный случай тоже полезен: индекс правильный, а провинция подставлена чужая.
Отдельный нюанс — города, которых в провинции несколько. Индекс уточняет не только провинцию, но и район, поэтому одной провинции соответствует много значений. Справочник должен хранить их все, а не одно значение на регион, иначе зависимый список индексов будет неполным и часть пользователей не найдёт свой. Как устроены индексы в других странах, разобрано в статье про форматы почтовых индексов.
Почему турецкий регистр букв ломает формы?
Турецкий алфавит содержит буквы, которых нет в латинском алфавите большинства языков: мягкая согласная с диакритическим знаком, шипящие с седилью, гласные с умлаутом. Но самая коварная пара — буква i с точкой и буква i без точки. В турецком языке это две разные буквы, и заглавная форма у них тоже разная.
Если программа переводит строку в верхний регистр без учёта турецких правил, из названия города получается неверное написание: вместо ожидаемой формы с точкой появляется форма без точки, и наоборот. Внешне это выглядит как мелкая косметическая ошибка, но для сравнения со справочником она фатальна: две записи, различающиеся одной буквой, перестают совпадать.
Вторая проблема — сортировка. В турецком алфавите буквы идут в собственном порядке, и буква без точки стоит перед буквой с точкой, а не после неё. Список городов, отсортированный по правилам другого языка, выглядит для местного пользователя неправильно, и найти нужный пункт в длинном выпадающем списке становится трудно. Это отдельный дефект, который замечают пользователи и не замечают автотесты.
Для теста это означает, что в набор нужны записи с обеими буквами, а также отдельная проверка перевода в верхний и нижний регистр на уровне интерфейса. Если ваша форма по-разному обрабатывает те же данные в браузере и на сервере, расхождение проявится именно здесь.
Как телефонный код должен сочетаться с городом
Турецкие телефонные номера начинаются с кода страны, а внутри страны делятся на городские и мобильные. Городской номер содержит код зоны, привязанный к провинции, поэтому номер и адрес проверяются в связке: если пользователь указал один город, а код зоны принадлежит другой провинции, перед нами либо ошибка ввода, либо неверно собранные тестовые данные.
Мобильные номера такой привязки не имеют: их можно использовать в любой точке страны, и требовать соответствия адресу не нужно. Разделение важно для тестов, потому что форма может проверять номер строже, чем следует, и отвергать корректный мобильный номер из-за несовпадения с городом. Подробнее о том, как такие связки устроены и почему они ломаются, рассказано в статье про соответствие телефонного кода и населённого пункта.
Есть и практическая деталь формата. Номера записывают с пробелами и дефисами, иногда в скобках, и все эти варианты означают одно и то же. Форма должна приводить запись к единому виду перед сравнением, иначе один и тот же номер будет выглядеть как три разных.
Что стоит проверить в форме с турецким адресом
Первый случай — диакритика. Проверьте, что ввод, сохранение, выгрузка и повторное чтение сохраняют все знаки без замены на похожие латинские буквы. Ошибка часто прячется в промежуточном звене: интерфейс показывает правильную строку, а в базе лежит уже испорченная.
Второй случай — регистр. Прогоните название города через приведение к верхнему и нижнему регистру в интерфейсе и убедитесь, что буквы не подменяются. Третий — зависимые списки: район не должен быть доступен без провинции, а квартал без района.
Четвёртый случай — порядок полей при выводе. Если форма собирает адресную строку сама, проверьте, что район и провинция стоят там, где их ожидает увидеть местный пользователь, а индекс не уехал в начало строки. Пятый — длина строки: турецкие названия бывают длинными, а полное написание включает и квартал, и улицу, и оба номера, поэтому ограничение в несколько десятков символов обрежет часть корректных адресов.
Отдельно стоит проверить подсказки и сообщения об ошибках: их текст должен использовать правильные буквы, иначе форма выглядит небрежно и вводит пользователя в заблуждение. Данные по стране в целом собраны на странице Турции.
Как переносить турецкий адрес между системами?
Когда адрес уходит из формы в базу, затем в отчёт, а оттуда в другую систему, его ждут три опасности. Первая — кодировка. Если промежуточный файл сохранён не в UTF-8, турецкие буквы превратятся в последовательности посторонних символов, и обратно их уже не собрать: значение изменится необратимо, а сравнение со справочником перестанет работать. Проверять это нужно на всём пути, а не только на экране формы.
Вторая опасность — сортировка и сравнение на стороне базы данных. Правила сопоставления строк в разных системах отличаются, и одинаковые на вид значения могут считаться разными, а разные — одинаковыми. Для турецких названий это особенно чувствительно, потому что буквы с точкой и без неё различаются, и система, которая этого не учитывает, склеит два разных населённых пункта в один.
Третья опасность — обрезка. Поле ограниченной длины молча теряет конец строки, а вместе с ним и часть названия. Если ограничение задано в байтах, а не в символах, турецкие буквы занимают больше места, и строка обрежется раньше, чем ожидалось. Это классическая ошибка, которая проявляется только на нелатинских данных и потому легко ускользает от обычных проверок.
Отдельно стоит упомянуть переименования. Названия провинций, районов и кварталов меняются, а вместе с ними устаревают справочники. Если форма хранит только текст названия, старые записи перестанут находиться после обновления справочника, поэтому рядом с названием полезно держать устойчивый код единицы и уже по нему строить сравнение.
Практический вывод простой. Прогоняйте тестовые адреса через весь путь целиком и сравнивайте результат с исходным значением, а не проверяйте каждое звено по отдельности. Только так видно, где именно теряются знаки и почему адрес, корректный на входе, оказывается неузнаваемым на выходе.
Границы: что синтетические записи не подтверждают
Записи, которые выдаёт генератор адресов, собраны по правилам формата: провинция, район, квартал, улица и индекс согласованы между собой, а номер дома и квартиры выглядят правдоподобно. Но это синтетические данные. За ними не стоит ни одного реального здания, и никакой адрес из набора не является адресом конкретного человека.
Практически это значит, что такую запись нельзя использовать для отправки письма или посылки, нельзя предъявлять как подтверждение места жительства и нельзя использовать, чтобы выдать себя за другого. Назначение этих образцов — проверка ваших собственных форм, справочников, зависимых списков и логики сортировки в тестовом окружении.
Что делать дальше
Соберите небольшой набор для турецкой формы: обычный адрес из крупного города, адрес с полностью записанным кварталом, запись для провинции с длинным названием, запись с диакритикой и негативные случаи с чужим индексом и чужим телефонным кодом. Отдельно зафиксируйте, какой порядок полей вы считаете правильным при выводе строки, чтобы результат не зависел от того, кто писал форму.