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
在白名单中,但 .ö
不在。这就是为什么您可以看到行为差异的原因。
我有一个文本字段,用户可以在其中添加 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
在白名单中,但 .ö
不在。这就是为什么您可以看到行为差异的原因。