Вторник , 19 Март 2024
ДомойПубликацииРабота с Punycode в C#

Работа с Punycode в C#

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

Использование данной библиотеки позволяет работать с ней многим языкам: C#, C++, F#, VB. Единый синтаксис подключения, конечно, отсутствует, но если вы знаете свою среду разработки, проблем быть не должно.

Преобразование международных доменов в Punycode

Немного про 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.

Рейтинг: 0

Автор публикации

2 070
не в сети 11 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (Оценок пока нет)
Загрузка...

5 комментариев

  1. Надежда Давыдова

    Попробую разобраться. Хотя мне как обычному пользователю это трудновато воспринимать. Пойду почитаю что там по ссылкам порекомендовано…

    Рейтинг: 0
  2. Надежда Давыдова

    Кстати, когда уже будет подписка, сапожник без сапог? ;)

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

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

Принять