URL에 허용되는 문자


191

누구나 인코딩하지 않고 GET 내에서 사용할 수있는 전체 문자 목록을 알고 있습니까? 현재 AZ az와 0-9를 사용하고 있지만 전체 목록을 찾고 있습니다.

또한 중국어, 아랍어 URL을 추가 할 때 출시 된 사양이 있는지에 관심이 있습니다 (분명히 내 질문에 큰 영향을 미칩니다)


5
URI에서 허용되는 문자는 예약 !*'();:@&=+$,/?#[]되거나 예약되지 않은 A-Za-z0-9_.~-문자 (또는 %백분율 인코딩의 일부로 백분율 문자 )
Mikl

1
MySQL에서는 이것을 사용 REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'하여 잘못된 문자가있는 URL 문자열을 찾습니다. 다른 사람에게도 유용 할 수 있습니다.
Mikl

@Mikl : 정규 표현식처럼 보이지 않습니다.
Jens Mander

답변:


182

에서 RFC 1738 사양 :

따라서 영숫자, 특수 문자 " $-_.+!*'(),"및 예약 된 목적으로 사용되는 예약 문자 만 URL 내에서 인코딩되지 않은 상태로 사용될 수 있습니다.

편집 : @ Juka K. Korpela가 올바르게 지적 했듯이이 RFC는 RFC 3986에 의해 업데이트되었습니다 . 이것은 호스트에 유효한 문자를 확장하고 명확히했습니다. 불행히도 쉽게 복사하여 붙여 넣을 수는 없지만 최선을 다하겠습니다.

첫 번째 일치 순서 :

host        = IP-literal / IPv4address / reg-name

IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"

IPvFuture   = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

IPv6address =         6( h16 ":" ) ls32
                  /                       "::" 5( h16 ":" ) ls32
                  / [               h16 ] "::" 4( h16 ":" ) ls32
                  / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
                  / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
                  / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
                  / [ *4( h16 ":" ) h16 ] "::"              ls32
                  / [ *5( h16 ":" ) h16 ] "::"              h16
                  / [ *6( h16 ":" ) h16 ] "::"

ls32        = ( h16 ":" h16 ) / IPv4address
                  ; least-significant 32 bits of address

h16         = 1*4HEXDIG 
               ; 16 bits of address represented in hexadecimal

IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

dec-octet   = DIGIT                 ; 0-9
              / %x31-39 DIGIT         ; 10-99
              / "1" 2DIGIT            ; 100-199
              / "2" %x30-34 DIGIT     ; 200-249
              / "25" %x30-35          ; 250-255

reg-name    = *( unreserved / pct-encoded / sub-delims )

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"     <---This seems like a practical shortcut, most closely resembling original answer

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

pct-encoded = "%" HEXDIG HEXDIG

5
@Tim 슬래시는 예약 된 문자이므로 예약 된 목적 (경로, 프로토콜 설명 ...)으로 사용되는 경우에는 이스케이프 할 필요가 없습니다. 그렇지 않으면 그렇습니다.
Myles

4
RFC 1738의 일반적인 구문 규칙은 1998 년에 폐기되었습니다.
Jukka K. Korpela

3
@Myles, STD 66 (= RFC 3986)이 다른 답변에 언급되어 있습니다. 답변 내용이 올바른지 다른 문제입니다. 나는 그 대답 중 하나가 전체 목록을 올바르게 묘사한다고 생각하지 않습니다.
Jukka K. Korpela

4
A-Za-z0-9_.-~이 답변의 시작 부분에 예약 되지 않은 예약 문자 목록을 추가 할 수 있습니다 . !*'();:@&=+$,/?#[]사람들을위한 시간을 절약 할 수 있습니다
Mikl

2
@basZero 혼란스러워서 죄송하지만 전체 답변은 간단하지 않습니다. 귀하의 질문에 대한 답변은 다음과 같이 예약 된 문자이므로 아니오입니다.reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
Myles

42

URI에서 허용되는 문자는 예약되거나 예약되지 않은 문자 (또는 퍼센트 인코딩의 일부인 퍼센트 문자)

http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters

RFC 3986은 예약되지 않은 문자 (sec. 2.3)와 예약 된 문자 (sec 2.2) 이며 특별한 의미를 유지해야 한다고 말합니다 . 또한 퍼센트 인코딩의 일부인 퍼센트 문자.


7
이 링크가 질문에 대답 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
jaestevan

@jaestevan 링크 된 문서에서 인용 :The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
Mikl

26

66 개의 예약되지 않은 문자의 전체 목록은 RFC3986에 있습니다. http://tools.ietf.org/html/rfc3986#section-2.3

이것은 다음 정규식 세트의 모든 문자입니다.

[A-Za-z0-9_.\-~]

2
예약 된 것을 사용할 수도 있습니다.
Qwerty

사용되지 않는 RFC1738 나열 {}^\~backtick같은 안전하지 않은. RFC3986은 파일 시스템으로 인해 안전하지 않은 것으로 표시합니다. 이것은 {}^또한 사용될 수 있음을 의미 합니다.
mgutt

당신이 말하는 말 찾기 위해 노력하고 경우에 따라서 문자열 내에서 URL을 (내가),가에있는 오래된 표준 갈 가장 좋은 것입니다 허용 대답 이 있다면 ... URL을 확인하는의 당신이해야 답변 에 문자 세트를 사용하십시오 .
ashleedawg

주의해서 이것을 정규 표현식 문자 클래스로 작성했습니다. 실제로는 46에서 126까지의 모든 ASCII 문자를 포함 -하므로 이스케이프 처리 하거나 문자 클래스의 시작 또는 끝에 배치하십시오 [.-~].
kwl

19

독일어 키보드에서 사용 가능한 모든 문자를 URL 매개 변수로 사용하여 웹 사이트 (apache)를 요청하여 테스트했습니다.

http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~

이들은 인코딩되지 않았습니다 :

^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~

다음에 인코딩되지 않음 urlencode():

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_

다음에 인코딩되지 않음 rawurlencode():

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~

참고 : RFC 1738 때문에 PHP 5.3.0 이전에 rawurlencode()인코딩 ~되었습니다 . 그러나 이것은 RFC 3986 으로 대체 되었으므로 안전하게 사용할 수 있습니다. 그러나 RFC 3986에 언급되지 않았기 때문에 예를 들어 인코딩 된 이유를 이해하지 못합니다 .{}rawurlencode()

내가 만든 추가 테스트는 메일 텍스트의 자동 링크에 관한 것입니다. Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de 및 yahoo.de를 테스트했으며 다음 문자가 포함 된 URL을 완전히 링크했습니다.

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@

물론 ?이 또한 연결되었지만 한 번만 사용 된 경우에만 연결됩니다.

어떤 사람들은 이제 rawurlencode()문자 만 사용하라고 제안 하지만 누군가이 웹 사이트를 여는 데 문제가 있다고 들었습니까?

별표
http://wayback.archive.org/web/*/http://google.com

콜론
https://ko.wikipedia.org/wiki/Wikipedia : 소개

플러스
https://plus.google.com/+google

서명 할 때 콜론, 쉼표 및 느낌표
https : //www.google.com/maps/place/USA/@36.2218457, ...

이 때문에 이러한 문자는 문제없이 인코딩없이 사용할 수 있어야합니다. 물론 당신은 &;같은 인코딩 시퀀스 때문에 사용해서는 안됩니다 &amp;. %일반적으로 문자를 인코딩하는 데 사용되는 것과 동일한 이유가 유효합니다 . 그리고 =매개 변수 이름에 값을 할당합니다.

마지막으로 인코딩되지 않은 다음을 사용하는 것이 좋습니다.

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@

그러나 무작위로 생성 된 URL이 .!필요한 경우을 사용하지 않아야합니다. URL이 문장의 끝을 표시하고 일부 메일 앱은 URL의 마지막 문자를 자동 링크하지 않기 때문입니다. 예:

Visit http://example.com/foo=bar! !

실용적 접근-잘하셨습니다. 당신의 마지막 목록을 찾고있었습니다- +특히 표지판 : -D
Oliver

12

에서 여기

따라서 $-_.+!*'(), 예약 된 목적으로 사용되는 영숫자, 특수 문자 및 예약 문자 만 URL 내에서 인코딩되지 않은 상태로 사용될 수 있습니다.



6

RFC3986 은 URI에서 사용할 수있는 두 가지 문자 세트를 정의합니다.

  • 예약 된 문자 ::/?#[]@!$&'()*+,;=

    예약 된 = gen-delims / sub-delims

    gen-delims = ":"/ "/"/ "?" / "#"/ "["/ "]"/ "@"

    하위 배달 = "!" / "$"/ "&"/ " '"/ "("/ ")"/ "*"/ "+"/ ","/ ";" / "="

    예약 문자의 목적은 URI 내의 다른 데이터와 구별 할 수있는 일련의 구분 문자를 제공하는 것입니다. 예약 문자를 해당 퍼센트 인코딩 된 옥텟으로 대체하는 URI는 동일하지 않습니다.

  • 예약되지 않은 캐릭터 :A-Za-z0-9-_.~

    예약되지 않음 = ALPHA / DIGIT / "-"/ "." / "_"/ "~"

    URI에서 허용되지만 예약 된 용도가없는 문자를 예약되지 않은 전화라고합니다.


3

다음 변경 사항은 URI가 아닌 중국어, 아랍어 도메인 이름에 대한 것입니다. 국제화 된 URI를 IRI라고하며 RFC 3987에 정의되어 있습니다. 그러나 URI 인코딩 / 디코딩의 많은 선택과 사양에 의해 안전한 것으로 간주되는 것과 실제 사용에 의해 안전한 것 (브라우저)이 많기 때문에 직접 수행하지 않고 테스트 된 기존 라이브러리에 의존하는 것이 좋습니다. .


0

사용자에게 특별한 경험 pushState을 제공하려면 브라우저의 URL에 다양한 문자를 가져올 수 있습니다 .

여기에 이미지 설명을 입력하십시오

var u="";var tt=168;
for(var i=0; i< 250;i++){
 var x = i+250*tt;
console.log(x);
 var c = String.fromCharCode(x);
 u+=c; 
}
history.pushState({},"",250*tt+u);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.