【问题标题】:Punycode for Unicode query parameterUnicode 查询参数的 Punycode
【发布时间】:2015-06-19 02:04:25
【问题描述】:

我正在尝试使用 Punycode 对一些 Unicode URL 进行编码。这些 URL 有一个包含非 ASCII 字符的查询参数,例如:

https://en.wiktionary.org/w/index.php?title=Clœlia&printable=yes

问题是,当我尝试在 Java 中执行此操作时,生成的 URL 是错误的:

String link = "https://en.wiktionary.org/w/index.php?title=Clœlia&printable=yes";
link = IDN.toASCII(link);

// -> link = http://en.wiktionary.org/w/index.xn--php?title=cllia&printable=yes-hgf

如果我这样做,结果字符串是不同的(我不知道为什么),但也是错误的:

String link = "http://en.wiktionary.org/w/index.php?title=" + IDN.toASCII("Clœlia") + "&printable=yes";

// -> link = http://en.wiktionary.org/w/index.php?title=xn--cllia-ibb&printable=yes

如果我从 Chrome 复制地址并将其粘贴到这里,我会得到这个 URL,这就是我想要的:

https://en.wiktionary.org/w/index.php?title=Cl%C5%93lia&printable=yes

我在这里做错了什么?

【问题讨论】:

    标签: java url unicode punycode


    【解决方案1】:

    你做错了什么是使用 punycode。 Punycode 用于域名,包括 URL 的域名partonly

    URL 的其他部分,包括查询参数部分,使用Percent Encoding 也称为 URL 编码或 URI 编码,这就是 Chrome 所做的;这会将非 ASCII Unicode 字符编码为 UTF-8,然后使用百分号 (%) 和两个十六进制数字对不在 ASCII 有限子集中的所有八位字节进行编码; UTF-8 用于非 ASCII 的八位字节 80-FF 始终是 % 编码的。 确切地说,查询参数部分通常和其他部分有时使用为 HTML 表单提交定义的轻微变体application/x-www-form-urlencoded;这会将空格编码为加号“+”而不是 %20,这是明确的,因为“+”已经在不安全集中,因此编码为 %2B。

    在 Java 中,为此使用 java.net.URLEncoder.encodejava.net.URLDecoder.decode;为了获得可靠的结果,请使用编码名称为“UTF-8”的较新的 2-arg 形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多