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

Special characters in QUrl will be transformed to 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 转换回特殊字符吗?为什么只有当我有顶级域时它才不会转换?

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

决定如何针对特定 url 采取行动的一种方法是通过 TLD 白名单。 在 Qt 中,您可以使用 QUrl::idnWhitelist()QUrl::setIdnWhitelist(const QStringList &list).

查看和编辑白名单

在您的示例中,.de 在白名单中,但 不在。这就是为什么您可以看到行为差异的原因。