자바에서 URL 쿼리 매개 변수 인코딩


108

Java에서 URL로 이동하기 위해 쿼리 매개 변수를 어떻게 인코딩합니까? 나는 이것이 명백하고 이미 질문 한 것처럼 보입니다.

확실하지 않은 두 가지 미묘함이 있습니다.

  1. URL에서 공백을 "+"또는 "% 20"으로 인코딩해야합니까? 크롬에서 "http://google.com/foo=?bar me"를 입력하면 크롬이 % 20으로 인코딩되도록 변경합니다.
  2. 콜론 ":"을 % 3B로 인코딩하는 것이 필요하거나 정확합니까? Chrome은 그렇지 않습니다.

노트:

  • java.net.URLEncoder.encode작동하지 않는 것 같습니다. 데이터를 인코딩하여 양식을 제출하는 것 같습니다. 예를 들어, +대신 공백을 %20인코딩하고 필요하지 않은 콜론을 인코딩합니다.
  • java.net.URI 쿼리 매개 변수를 인코딩하지 않음

이 질문은 유용 해 보입니다. stackoverflow.com/questions/444112/…
Alex Black

2
대부분의 경우 application/x-www-form-urlencoded키 / 값 쌍을 예상하지만 쿼리 부분의 구조는 서버에 따라 다릅니다 . 더 여기를 참조하십시오 : illegalargumentexception.blogspot.com/2009/12/...을
맥도웰

답변:


127

java.net.URLEncoder.encode(String s, String encoding)너무 도움이 될 수 있습니다. HTML 형식 인코딩을 따릅니다 application/x-www-form-urlencoded.

URLEncoder.encode(query, "UTF-8");

반면, 백분율 인코딩 ( URL 인코딩 이라고도 함 )은 %20. 콜론은 예약 된 문자이므로 :인코딩 후에도 여전히 콜론으로 유지됩니다.


3
나는 그것이 URL 인코딩을한다고 생각하지 않고 대신 양식을 통해 제출할 데이터를 인코딩한다고 언급했습니다. 코멘트?
Alex Black

MIME 형식 (유효한 HTML 형식 인코딩)을 URLEncoder따르기 때문 입니다 application/x-www-form-urlencoded. 나는 그것이 당신이 찾고있는 것이 아니라고 가정하고 있습니다.
Buhake Sindi 2011 년

6
결국 URLEncoder.encode를 사용하고 "+"를 "% 20"으로 바 꾸었습니다
Alex Black

2
슬래시를 "% 2F"로 인코딩합니다. URL 슬래시를 그대로 두어야하지 않습니까?
golimar

6
@golimar 아니요, 안됩니다. 전체 URL이 아닌 매개 변수 값만 제공해야합니다. 예를 고려하십시오 http://example.com/?url=http://example.com/?q=c&sort=name. 인코딩해야할까요 &sort=name? URL과 값을 구별 할 수있는 방법이 없습니다. 이것이 바로 값 인코딩이 필요한 정확한 이유입니다.
Pijusn 2014-08-23

15

편집 : URIUtil더 이상 최신 버전에서 더 이상 사용할 수 없으며 Java 에서 더 나은 대답 - 이 스레드에서 URL 인코딩 또는 Mr. Sindi에 의해.


URIUtilApache httpclient의 몇 가지 대안 이 있지만 정말 유용합니다.

URIUtil.encodeQuery(url);

예를 들어 공백을 "% 20"대신 "+"로 인코딩합니다.

둘 다 올바른 컨텍스트에서 완벽하게 유효합니다 . 정말로 선호한다면 문자열 교체를 발행 할 수 있습니다.


동의해야합니다. HttpClient를 사용하면 훨씬 더 행복해질 것입니다.
DaShaun 2011 년

유망 해 보이는데 우연히 링크가 생겼나요? 인터넷 검색 중이지만 많은 것을 찾습니다.
Alex Black

1
이 방법은 HttpClient 4.1에없는 것 같습니다. hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/…
Alex Black

@Alex, 흠 짜증나 네요. 저는 항상 좋은 결과로 그 루틴을 사용했습니다. 한 가지 아이디어는 3 릴리스에서 소스 코드를 가져 오는 것입니다. 이제 분명히 더 이상 유지하고 싶지 않기 때문입니다.
Johan Sjöberg 2011 년

1
URIUtil.encodeWithinQuery원래 질문이 묻는 것처럼 개별 쿼리 매개 변수를 인코딩하는 것입니다.
Jesse Glick

13

불행히도 URLEncoder.encode ()는 유효한 백분율 인코딩을 생성하지 않습니다 ( RFC 3986에 지정된 대로 ).

URLEncoder.encode ()는 공백이 "+"로 인코딩되는 것을 제외하고 모든 것을 잘 인코딩합니다. 내가 찾을 수있는 모든 Java URI 인코더는 쿼리, 조각, 경로 부분 등을 인코딩하는 공용 메서드 만 노출하지만 "원시"인코딩은 노출하지 않습니다. 조각과 쿼리가 공간을 +로 인코딩 할 수 있기 때문에 유감스럽게도 사용하고 싶지 않습니다. 경로가 올바르게 인코딩되었지만 먼저 "정규화"되어 있으므로 '일반'인코딩에도 사용할 수 없습니다.

내가 생각 해낼 수있는 최고의 솔루션 :

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

경우 replaceAll()당신을 위해 너무 느립니다, 나는 대안은 자신의 인코더를 출시 할 것 같아요 ...

편집 : "?", "&", "="를 올바르게 인코딩하지 않는이 코드를 여기에 먼저 넣었습니다.

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);

+완벽하게 유효한 공백 인코딩입니다.
Lawrence Dol 2015

@LawrenceDol 사실이지만 때로는 +잘못 해석 될 수 있습니다. C # blogs.msdn.microsoft.com/yangxind/2006/11/08/…을
Lu55

이. 다양한 대안을 자바 스크립트의 encodeURIComponent메소드 출력 과 비교 했는데 이것이 제가 시도한 것들 (공백, 터키어 및 독일어 특수 문자가 포함 된 쿼리)과 정확히 일치하는 유일한 것입니다.
Utku Özdemir 2011

8

쿼리에서 콜론을 % 3B로 인코딩 할 필요는 없지만 불법은 아닙니다.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

또한 공간이 ALPHA 또는 DIGIT인지 의심하기 때문에 백분율로 인코딩 된 공간 만 유효한 것으로 보입니다.

에 보이는 URI를 사양 자세한 내용은.


그러나 이렇게하면 쿼리 문자열의 해석이 서버에 달려 있기 때문에 URI의 의미를 변경할 수 있습니다. application/x-www-form-urlencoded쿼리 문자열을 생성하는 경우 둘 다 괜찮습니다. 사용자가 입력 / 붙여 넣기 한 URL을 수정하는 경우에는 :그대로 두어야합니다.
tc.

@tc. 콜론이 일반 구분 기호로 사용된다면 맞습니다 (RFC 12 페이지). 그러나 일반 구분 기호로 사용되지 않는 경우 두 인코딩 모두 동일하게 해석되어야합니다.
Edwin Buck

URL은 실제로 URI의 하위 집합이 아니므로주의해야합니다. adamgent.com/post/25161273526/urls-are-not-a-subset-of-uris
Adam Gent

5

내장 된 Java URLEncoder는 예상되는 작업을 수행하므로 사용해야합니다.

"+"또는 "% 20"은 둘 다 URL의 공백 문자에 대한 유효한 대체입니다. 둘 중 하나가 작동합니다.

":" 구분 문자이므로 인코딩 되어야 합니다. 즉 http : // foo 또는 ftp : // bar . 특정 브라우저가 인코딩되지 않은 경우 처리 할 수 ​​있다는 사실은 정확하지 않습니다. 인코딩해야합니다.

좋은 방법으로 문자 인코딩 매개 변수를 사용하는 방법을 사용해야합니다. UTF-8이 일반적으로 사용되지만 명시 적으로 제공해야합니다.

URLEncoder.encode(yourUrl, "UTF-8");

5
+의 공간만을 표현한 것입니다 application/x-www-form-urlencoded. HTTP로 제한되어 있어도 작동이 보장되지 않습니다. 마찬가지로, :유효 쿼리 문자열하지 말아야 로 변환 %3B; 서버는 그것들을 다르게 해석하도록 선택할 수 있습니다.
tc.

1
이 방법은 또한 전체 url 슬래시와 일부 예 http://를 들어 http%3A%2F%2F올바르지 않은 기타 문자를 인코딩 합니다
To Kra

2
@ToKra는 http://부분 을 인코딩해서는 안됩니다 . 이 메소드는 쿼리 매개 변수 및 인코딩 된 양식 데이터를위한 것입니다. 그러나 다른 웹 사이트의 URL을 쿼리 매개 변수로 전달하려는 경우 URL 구문 분석기를 혼동하지 않도록 인코딩해야합니다.
beldaz

@tc의 내 독서 w3.org/TR/html4/interact/forms.html#h-17.13.3.3는 모든 GET 양식 데이터로 인코딩되어 있다는 점이다 application/x-www-form-urlencoded콘텐츠 형식. 이것이 HTTP에서 작동해야한다는 뜻이 아닙니까?
beldaz

0

URL에 공간 문제 만있는 경우. 나는 아래 코드를 사용했으며 잘 작동합니다.

String url;
URL myUrl = new URL(url.replace(" ","%20"));

예 : URL은

www.xyz.com?para= 안녕하세요 선생님

그러면 muUrl의 출력은 다음과 같습니다.

www.xyz.com?para=hello%20sir


0
String param="2019-07-18 19:29:37";
param="%27"+param.trim().replace(" ", "%20")+"%27";

Datetime (Timestamp) URLEncoder.encode(param,"UTF-8")이 작동하지 않는 경우 관찰했습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.