【问题标题】:Redirecting Servlet to Unicode-Domains将 Servlet 重定向到 Unicode 域
【发布时间】:2026-01-19 19:20:03
【问题描述】:

我在使用 Unicode-URL 向 servlet 发送重定向时遇到问题。

即考虑以下土耳其语网址

http://türkçeisimtescil.com

如果您将其粘贴到浏览器的地址栏中,它就会起作用。但是它被翻译成

http://xn--trkeisimtescil-ijb74a.com

根据您的要求由您的浏览器提供。

假设我有第一个带有 UTF8 特定字符的 URL,并且我从 DB 成功获取了它。我想将我的 servlet 重定向到那个 URL。

但是,当我只做response.sendRedirect(url);(根据标题)时,它会将我重定向到www.t%1frk%e7eisimtescil.com

我什至尝试了response.sendRedirect("http://www.t\u011Frk\u00E7eisimtescil.com");(内联编码)并且响应完全一样。

也许如果我在标题上获得 türkçeisimtescil.com,浏览器会将其转换为xn--.. 格式并且它会成功。

我无法弄清楚编码被破坏的地方。任何帮助表示赞赏。

【问题讨论】:

    标签: java redirect character-encoding servlets


    【解决方案1】:

    这是一个Internationalized Domain Name (IDN)。它在ASCII and Unicode 之间的转换在RFC 3490 中指定。在 Java 中,您可以使用java.net.IDN 在两者之间进行转换。您可以使用java.net.URL从URL中获取主机部分。

    String host = new URL("http://türkçeisimtescil.com").getHost();
    String idn = IDN.toASCII(host);
    String newURL = "http://" + idn;
    

    【讨论】:

      【解决方案2】:

      解决了。

      java.net.IDN 的 IDN 类通过获取“ponycode”(xn--..) URL 解决了这个问题。

      java.net.IDN.toASCII(url)
      

      连续 3 次自答自答 :)

      【讨论】:

      • 你很快!请注意,您只想转换域(主机)部分。看我的回答。
      • 实际上我需要整个 url(权限、端口、查询字符串、域)来转换。当然,IDN ponycode 应该只适用于域。我正在寻找一个方便的解决方案,因为它会执行类似 xn--http://.. 的操作,这是出乎意料的(对我而言)。有什么想法吗?
      • 有趣的是,它为http://A.türkçehttp://w.türkçe 生成了一个http://xn--,但xn--http://http://türkçeblabla... 拉了我的头发。
      • 问题出在这里:String idn = IDN.toASCII("http://türkçeisimtescil.com"); System.out.println(idn); 生成一个xn--http:// which 是错误的。我应该只转换域而不会丢失 authentication:data@and:port/orFile?plus=querystrings#and_refs 中的任何内容