Кодировка URI Java и RFC 3986

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

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

Спасибо


person Mark    schedule 03.05.2011    source источник


Ответы (5)


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

URI uri = new URI("http", "//hello world", null);
String urlString = uri.toASCIIString();
System.out.println(urlString);
person MeBigFatGuy    schedule 03.05.2011
comment
Просто передайте null в качестве первого параметра. - person user207421; 27.03.2012

Решено с этим:

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

Метод encodeUri

person Mark    schedule 03.05.2011

Источник: функции кодирования, совместимые с 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("+", "%20").replace("*", "%2A")
                .replace("%7E", "~");
        // This could be done faster with more hand-crafted code.
    } catch (UnsupportedEncodingException wow) {
        throw new RuntimeException(wow.getMessage(), wow);
    }
}
person Amit Tumkur    schedule 19.03.2016
comment
scribejava также использует этот подход, но если вы используете пример, приведенный в RFC 5849 (OAuth 1.0) этот метод не может правильно кодировать такой параметр, как a3=2+q, так как это будет кодировать строку в a3=2%2Bq вместо a3=2%20q, поскольку URLEncoder кодирует строку до того, как замена может иметь место - person Roman Vottner; 16.07.2019

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

ул.repaceAll("+","%20")

person Radu Stoenescu    schedule 03.05.2011
comment
Дело не только в +, речь идет о полном следовании спецификации RFC 3986 вместо RFC 1738, который подходит для параметров запроса (для которого требуется +). - person Mark; 03.05.2011

В случае веб-приложений 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

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

?KEY1=Wally's%20crazy%20emp%C3%B4rium%3D&KEY2=Horibble%20%25%20sign%20in%20value

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

person Jason Dunkelberger    schedule 21.02.2012