Стало мне интересно, как происходит преобразование кириллических доменов типа домен.рф к виду xn--d1acufc.xn--p1ai и для чего это нужно. Разобрался на примитивном обывательском уровне. Теперь попробую объяснить доступно, не оперируя по возможности высоконаучными терминами.
Система доменных имён (DNS) работает только с кодировкой ASCII, а именно с такими её символами, как латинские буквы a-z, цифры 0-9, знаки «-» и «.». Когда встал вопрос о появлении национальных доменов, то было принято решение эту систему не менять, а перекодировать на стороне пользователей последовательности символов национальных алфавитов в последовательности латинских букв и цифр.
Был разработан специальный алгоритм перекодировки. С этим алгоритмом научились работать все популярные браузеры. Когда мы набираем в браузере домен.рф, то браузер сначала выполняет преобразование к виду xn--d1acufc.xn--p1ai, и только потом отправляет запрос в систему DNS.
Данный алгоритм реализуется следующим образом:
1. Все символы переводятся в нижний регистр.
2. Происходит преобразование национальных символов к стандарту UNICODE, в котором представлены почти все национальные алфавиты. Например, буквы русского алфавита в нижнем регистре записаны таким образом:
UNICODE | буквы |
0?0430 | а |
0?0431 | б |
0?0432 | в |
0?0433 | г |
0?0434 | д |
0?0435 | е |
0?0451 | ё |
0?0436 | ж |
0?0437 | з |
0?0438 | и |
0?0439 | й |
0x043A | к |
0x043B | л |
0x043C | м |
0x043D | н |
0x043E | о |
0x043F | п |
0?0440 | р |
0?0441 | с |
0?0442 | т |
0?0443 | у |
0?0444 | ф |
0?0445 | х |
0?0446 | ц |
0?0447 | ч |
0?0448 | ш |
0?0449 | щ |
0x044A | ъ |
0x044B | ы |
0x044C | ь |
0x044D | э |
0x044E | ю |
0x044F | я |
3. Последовательность символов в кодировке UNICODE с помощью технологии Punycode преобразуется в формат АСЕ, который представляет собой кодировку ASCII (латинские буквы, цифры и «-«), понятную DNS-серверам. Стоит отметить, что на этом этапе перекодировка выполняется не посимвольно, а по заковыристому алгоритму, суть которого здесь раскрывать не буду. Приведу лишь некоторые примеры такого преобразования:
а | 80a |
б | 90a |
аб | 80ac |
аба | 80aac |
Если хотите узнать о преобразовании во всех подробностях, вот ссылка на официальный документ на английском языке. Я приведу лишь пример из этого документа для закрепления материала:
Перекодируем фразу «ПочемуЖеОниНеГоворятПоРусски«.
Переводим в нижний регистр: почемужеонинеговорятпорусски.
Переводим в Юникод посимвольно:
u+043F u+043E u+0447 u+0435 u+043C u+0443 u+0436 u+0435 u+043E
u+043D u+0438 u+043D u+0435 u+0433 u+043E u+0432 u+043E u+0440
u+044F u+0442 u+043F u+043E u+0440 u+0443 u+0441 u+0441 u+043A
u+0438
Применяем технологию преобразования Punycode: b1abfaaepdrnnbgefbaDotcwatmq2g4l
И, чтобы подчеркнуть национальность домена, добавляем xn--: xn--b1abfaaepdrnnbgefbaDotcwatmq2g4l
xn-- сообщает браузеру и другим программам, что используется национальный домен, и что не плохо было бы отображать его в удобоваримом виде.
В заключении отмечу, что если вам вдруг понадобится осуществить перекодировку кириллического домена, то достаточно будет воспользоваться одним из готовых решений. В любой поисковой системе ищем «Punycode перекодировщик» или «Unicode Punycode Конвертер«. Мне понравился вот этот перекодировщик, работающий в обоих направлениях.