Эта небольшая заметка будет полезна программистам, которым необходимо работать с международными доменами. Подразумевается, что будет использоваться платформа .NET, точнее, фреймворк .NET Framework.
Использование данной библиотеки позволяет работать с ней многим языкам: C#, C++, F#, VB. Единый синтаксис подключения, конечно, отсутствует, но если вы знаете свою среду разработки, проблем быть не должно.
Немного про punycode я уже рассказывал ранее. Но, если вам лениво перейти на соответствующую страницу и почитать, в двух словах расскажу суть.
Имя домена может состоять только из букв латинского алфавита (регистр значения не имеет), цифр и символа —. Чтобы не менять протоколы взаимодействия, а с ними и кучу связных программ, был найден нетривиальный способ: национальный домен (содержащий, к примеру, кириллические символы) кодируется таким образом, чтобы его имя содержало лишь допустимые символы. В итоге, адрес президент.рф преобразуется в xn--d1abbgf6aiiy.xn--p1ai. Далее, производители браузеров внедрили прозрачную работу с этими доменами (ведь запомнить xn--что-то — задача не из лёгких), и всё завертелось.
Казалось бы, всё должно быть замечательно. Но так повелось, что большинство программистов — люди довольно старообрядческие, которые с некоторой неохотой принимают новое. Частично из-за этого некоторые сервисы работают только с punycode представлением, а некоторые, наоборот, требуют истинное имя. И ладно, если процесс ввода должен контролировать программист. Но заставить пользователя самостоятельно вводить правильное имя — моветон.
Вот мы и подошли к сути: если программа должна подключаться к серверу, который ожидает определённого ввода данных, все процессы преобразований должны происходить внутри приложения. Пользователю же необходимо дать возможность вводить любые данные. По аналогии с главным вопросом данной статьи — если у пользователя есть только puny-имя — хорошо, но не должно быть ничего страшного и в том случае, когда юзер захочет ввести оригинальное название.
К счастью, никаких классов (как это нужно было делать в PHP), искать не требуется. Разработчики уже давно обо всём позаботились, включив во фреймворк класс IdnMapping, расположенный в пространстве имён System.Globalization. В своей программе достаточно лишь создать экземпляр этого класса. Сделать можно хотя бы так:
System.Globalization.IdnMapping idn = new System.Globalization.IdnMapping();
После чего остаётся обратиться к соответствующим методам для перекодировки строк.
Конвертация из punycode:
string url = "xn--d1abbgf6aiiy.xn--p1ai";
string str = idn.GetUnicode(url);
MessageBox.Show(str); // выведет «президент.рф»
Конвертация в punycode:
string url = "президент.рф";
string str = idn.GetAscii(url);
MessageBox.Show(str); // выведет «xn--d1abbgf6aiiy.xn--p1ai»
Класс содержит ещё некоторые возможности, но основные я привёл. Если есть желание узнать дополнительные фишки, добро пожаловать в MSDN.
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц
Попробую разобраться. Хотя мне как обычному пользователю это трудновато воспринимать. Пойду почитаю что там по ссылкам порекомендовано…
Ещё и находится время для программирования?!!
Я в шоке! Глубокий респект.
Кстати, когда уже будет подписка, сапожник без сапог? ;)
Так уже должно ходить, по крайней мере письма-уведомления
Пробовал на свой аккаунт @gmail — принимает.
Ага, нашла в спаме. Теперь буду наслаждаться!