Кодирование URI Java и RFC 3986

#java #uri #encode #rfc3986

#java #uri #кодировать #rfc3986

Вопрос:

существует ли класс для кодирования общего String в соответствии со спецификацией RFC 3986?

То есть: "hello world" => "hello world" Нет (RFC 1738): "hello world"

Спасибо

Ответ №1:

Решаемая с помощью этого:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/util/UriUtils.html

Метод encodeUri

Ответ №2:

Если это URL, используйте URI

 URI uri = new URI("http", "//hello world", null);
String urlString = uri.toASCIIString();
System.out.println(urlString);
  

Комментарии:

1. Просто передайте null в качестве первого параметра.

2. java.net . URI реализует RFC2396, а не RFC3986; если вы смешаете их, вы получите разные канонические формы (например, имена хостов в нижнем регистре или нет).

Ответ №3:

Источник: функции кодирования, совместимые с Twitter RFC3986.

Этот метод принимает строку и преобразует ее в кодированную строку, специфичную для RFC3986.

 /** The encoding used to represent characters as bytes. */
public static final String ENCODING = "UTF-8";

public static String percentEncode(String s) {
    if (s == null) {
        return "";
    }
    try {
        return URLEncoder.encode(s, ENCODING)
                // OAuth encodes some characters differently:
                .replace(" ", " ").replace("*", "*")
                .replace("~", "~");
        // This could be done faster with more hand-crafted code.
    } catch (UnsupportedEncodingException wow) {
        throw new RuntimeException(wow.getMessage(), wow);
    }
}
  

Комментарии:

1. scribejava также использует этот подход, хотя, если вы используете пример, приведенный в RFC 5849 (OAuth 1.0) , этот метод не может правильно закодировать параметр like a3=2 q , поскольку это приведет к кодированию строки в a3=2+q вместо a3=2 q , поскольку URLEncoder кодирует строку до того, как может произойти замена

Ответ №4:

В не знаю, есть ли он. Существует класс, который обеспечивает кодирование, но он изменяет » » на » «. Но вы можете использовать метод replaceAll в классе String, чтобы преобразовать » » в то, что вы хотите.

str.repaceAll(» «,» «)

Комментарии:

1. Речь идет не только о » «, речь идет о полном следовании спецификации RFC 3986 вместо RFC 1738, которая подходит для параметров запроса (для этого требуется » «).

Ответ №5:

В случае веб-приложений Spring я смог использовать это:

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/util/UriComponentsBuilder.html

 UriComponentsBuilder.newInstance()
  .queryParam("KEY1", "Wally's crazy empôrium=")
  .queryParam("KEY2", "Horibble % sign in value")
  .build().encode("UTF-8") // or .encode() defaults to UTF-8
  

возвращает строку

?КЛЮЧ1=Wally's crazy empôrium= amp; КЛЮЧ2= Horibble % sign in value

Перекрестная проверка на одном из моих любимых сайтов показывает тот же результат, «Процентное кодирование для URI». На мой взгляд, выглядит неплохо. http://rishida.net/tools/conversion /