我有一个文本字段,用户可以在其中添加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转换回特殊字符吗?为什么只有当我拥有顶级域名时才不转换?
答案 0 :(得分:0)
某些url用Unicode字符显示而另一些用punnycode显示的原因是为了防止同形异义词攻击。
一种决定如何对特定网址进行操作的方法是使用TLD白名单。
在Qt中,您可以使用QUrl::idnWhitelist()
和QUrl::setIdnWhitelist(const QStringList &list)
查看和编辑白名单。
在您的示例中,.de
在白名单中,而.ö
在白名单中。这就是为什么您会看到行为有所不同的原因。