Почему знаки препинания кодируют UTF 8, а английские символы - нет? - PullRequest
0 голосов
/ 13 марта 2012

Я хотел бы закодировать строку в utf-8, код:

URLEncoder.encode("http://www.example.com/sf?s=191ae04f&an=马赛克.jpg","UTF-8");

и результат:

http%3A%2F%2Fwww.example.com%2Fsf%3Fs%3D191ae04f%26an%3D%C2%ED%C8%FC%BF%CB.jpg

, как вы можете видеть, знаки пунктуации, такие как : / ? &, были закодированы в utf-8, но какой результат я хотел бы видеть:

http://www.example.com/sf?s=191ae04f&an=%C2%ED%C8%FC%BF%CB.jpg 

Что-то не так?

Ответы [ 4 ]

4 голосов
/ 13 марта 2012

Необходимо кодировать URL только отдельные компоненты URL, такие как имена / значения параметров строки запроса, которые могут содержать символы вне диапазона ASCII, а не весь URL.

String an = URLEncoder.encode("马赛克.jpg", "UTF-8");
String url = "http://www.example.com/sf?s=191ae04f&an=" + an;
// ...
1 голос
/ 13 марта 2012

Вы URL-кодировали всю строку, чтобы вы могли включить ее в URL, например:

http://www.yyy.com?forward=http%3A%2F%2Fwww.xxx.com%2Fsf%3Fs%3D191ae04f%26an%3D%C2%ED%C8%FC%BF%CB.jpg

Однако вы, похоже, хотите закодировать только значения параметров вашего исходного URL. Таким образом, вам нужно разделить URL-адрес, кодировать URL-адрес только значений параметров и снова соединить их вместе.

0 голосов
/ 13 марта 2012

Прежде всего, вы должны кодировать только компонент пути URL.

Следующие символы являются символами резервирования в URI согласно спецификации URI.Таким образом, URLEncode будет экранировать эти символы.

":" / "/" / "?" / "#" / "[" / "]" / "@"

Ссылка:

URI Зарезервированные символы

0 голосов
/ 13 марта 2012

Как ответили в Java - кодировать URL , вы можете использовать что-то вроде

public URL parseUrl(String s) throws Exception {
     URL u = new URL(s);
     return new URI(
            u.getProtocol(), 
            u.getAuthority(), 
            u.getPath(),
            u.getQuery(), 
            u.getRef()).
            toURL();
}

Причина в том, что различные части URL должны быть закодированы 1009 * иначе *.

Увы, в вашем случае URLEncoder должен только быть применен к значению вашего параметра запроса.

...