QUrl中的特殊字符将转换为punycode

时间:2019-07-09 09:46:12

标签: qt special-characters punycode qurl

我有一个文本字段,用户可以在其中添加URL,而我有一个文本字段,用户可以在其中添加QUrl::fromUserInput(),然后将其放入列表。 如果我在"http://blöd.de/"之类的URL中使用特殊字符,它将显示为"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转换回特殊字符吗?为什么只有当我拥有顶级域名时才不转换?

1 个答案:

答案 0 :(得分:0)

某些url用Unicode字符显示而另一些用punnycode显示的原因是为了防止同形异义词攻击。

一种决定如何对特定网址进行操作的方法是使用TLD白名单。 在Qt中,您可以使用QUrl::idnWhitelist()QUrl::setIdnWhitelist(const QStringList &list)查看和编辑白名单。

在您的示例中,.de在白名单中,而在白名单中。这就是为什么您会看到行为有所不同的原因。