Специальные символы в QUrl будут преобразованы в punycode

У меня есть текстовое поле, в котором пользователь может добавить URL-адрес. У меня есть текстовое поле, в котором пользователь может добавить URL-адрес с помощью QUrl::fromUserInput(), а затем он будет помещен в список. Если я использую специальные символы в URL-адресе, такие как "http://blöd.de/", он будет отображаться как "http://blöd.de/", но если я введу только "ö", он будет преобразован в punycode "http://xn--nda/".

Я пробовал каждую QUrl::FormattingOptions и каждую QUrl::ParsingMode

qDebug() << QUrl::fromUserInput("blöd.de"); // results in: http://blöd.de
qDebug() << QUrl::fromUserInput("ö");       // results in: http://xn--nda

У кого-нибудь есть идея, как я могу преобразовать этот punycode обратно в специальный символ? И почему он не конвертируется только тогда, когда у меня домен верхнего уровня?


person Vanessa    schedule 09.07.2019    source источник


Ответы (1)


Причина, по которой некоторые URL-адреса отображаются с символами Unicode, а другие — с панникодом, заключается в предотвращении атак с использованием омографов.

Один из способов решить, как вести себя с конкретным URL-адресом, — использовать белый список TLD. В Qt вы можете просматривать и редактировать белый список, используя QUrl::idnWhitelist() и QUrl::setIdnWhitelist(const QStringList &list).

В вашем примере .de есть в белом списке, а нет. Вот почему вы можете увидеть разницу в поведении.

person Benjamin T    schedule 09.07.2019