2015-06-19 1 views
1

Я пытаюсь закодировать некоторые URL-адреса Юникода с помощью Punycode. Эти адреса имеют параметр запроса, который содержит не-ASCII символы, например:Punycode для параметра запроса Unicode

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 

Что я здесь сделал неправильно?

ответ

1

Что вы сделали неправильно, это использование punycode. Punycode используется для доменных имен, включая доменное имя часть URL-адреса, только.

Другие части URL-адреса, включая часть параметров запроса, используют Percent Encoding, также известный как кодирование URL или кодирование URI, и это то, что делает Chrome; это кодирует символы Unicode без символов ASCII в UTF-8, а затем все октеты, которые не находятся в ограниченном подмножестве ASCII, с использованием знака процента (%) и двух шестнадцатеричных цифр; октеты 80-FF, используемые UTF-8 для не-ASCII, всегда% -кодируются. Точнее, часть параметров запроса обычно и другие части иногда используют небольшой вариант, определенный для отправки HTML-формы как application/x-www-form-urlencoded; это кодирует пространство как плюс-знак «+» вместо% 20, что недвусмысленно, потому что «+» уже находится в небезопасном наборе, закодированном таким образом как% 2B.

В Java используют java.net.URLEncoder.encode и java.net.URLDecoder.decode; для надежных результатов используйте более новые формы 2-arg с именем кодировки «UTF-8».

 Смежные вопросы

  • Нет связанных вопросов^_^