是否有人知道可以在GET中使用而无需编码的完整字符列表?目前,我正在使用AZ az和0-9 ...,但我希望了解完整列表。

我也很感兴趣是否有针对即将推出的产品发布的规范中文,阿拉伯语网址(显然会对我的问题产生很大的影响)

评论

URI中允许的字符是保留的!*'();:@&= + $,/?#[]或未保留的A-Za-z0-9_。〜-(或百分比字符%作为百分比的一部分) -encoding)

在MySQL中,我使用REGEXP'[^] A-Za-z0-9_。〜!*''();:@&= + $,/?#[%-] +'查找带有错误字符的URL字符串。也许对其他人也有用。

@Mikl:那东西看起来几乎不像正则表达式。

#1 楼

编辑:正如@Jukka K. Korpela正确指出的那样,RFC 1738已由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
 

来自RFC 1738规范的原始答案:

因此,只能在URL中使用未编码的字母数字,特殊字符“ $-_.+!*'(),”和用于保留目的的
保留字符。

^自1998年以来已过时。

评论


@Tim斜杠是保留字符,因此,如果将其用于保留目的(描述路径,协议描述...),则不需要转义。否则,它会。

–迈尔斯
2012年7月6日在22:26

RFC 1738的通用语法规则在1998年被废弃。

– Jukka K. Korpela
13年8月8日在7:17

@ Myles,STD 66(= RFC 3986)在其他答案中被提及。答案的内容是否正确是另一个问题。我认为任何答案都不能正确描述完整列表。

– Jukka K. Korpela
13年8月8日在15:05

并且您可以在此答案的开头添加未保留的A-Za-z0-9 _.-〜和保留字符的列表。 !*'();:@&= + $,/?#[]可以为人们节省时间

– Mikl
16年5月30日在16:20



@basZero对不起,您发现它令人困惑,但是完整的答案并不简单。您的问题的答案是否定的,因为它是保留字符,如下所示:reserved = gen-delims / sub-delims gen-delims =“:” /“ /” /“?” /“#” /“ [” /“]” /“ @”

–迈尔斯
16年8月31日在22:13

#2 楼


URI中允许的字符是保留的还是不保留的(或作为百分比编码一部分的百分比字符)


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

表示,如果需要保留特殊含义,它们是RFC 3986未保留字符(第2.3节)以及保留字符(第2.2节)。还将百分比字符作为百分比编码的一部分。

评论


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。

–j.a.estevan
2014年5月15日18:40

链接文档中的@ j.a.estevan引用:URI中允许的字符是保留的还是不保留的(或作为百分号编码的一部分的百分号)

– Mikl
16年5月30日在16:05

#3 楼

66个未保留字符的完整列表在RFC3986中,在这里:http://tools.ietf.org/html/rfc3986#section-2.3

这是以下正则表达式集中的任何字符:

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


评论


您也可以使用保留的那些。

– Qwerty
13年3月21日在11:53

过期的RFC1738列出了{} ^ \〜并反引号表示不安全。由于文件系统,RFC3986列出\为不安全。这意味着{} ^也可以使用。

– mgutt
17-2-16在15:22



因此,如果您要尝试在字符串中找到URL的结尾(即我),则最好采用公认的答案中的过时标准...如果要验证URL,则应在此答案上使用字符集。

–ashleedawg
18年7月14日在10:17

小心,您已将其编写为正则表达式字符类。确保转义-或将其放在字符类的开头或结尾,因为[.-〜]实际上包含从46到126的所有ASCII字符。

–kwl
19年1月24日在7:25

#4 楼

我通过请求我的网站(apache)进行了测试,并将德语键盘上所有可用的字符作为URL参数:

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


这些未编码:

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


urlencode()之后未编码:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_


rawurlencode()之后未编码:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~


注意:在PHP 5.3.0之前,由于RFC 1738,rawurlencode()编码为~。但是现在已由RFC 3986取代,因此现在可以安全使用。但是我不明白为什么{}是通过rawurlencode()编码的,因为在RFC 3986中未提及它们。

我进行的另一项测试是有关邮件文本中的自动链接的。我测试了Mozilla Thunderbird,aol.com,outlook.com,gmail.com,gmx.de和yahoo.de,它们完全链接了包含以下字符的URL:

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


当然,?也被链接了,但只有使用一次即可。

现在有人建议只使用rawurlencode()字符,但是您是否听说有人在打开这些网站时遇到问题?

星号http://wayback.archive.org/web/*/http://google.com

冒号https://en.wikipedia.org/wiki/维基百科:关于

加号https://plus.google.com/+google

标志处的冒号,逗号和感叹号https://www.google.com/maps /place/USA/@36.2218457,...

因为这些字符应该未经编码就可以使用而不会出现问题。当然,由于编码序列如&;,您不应该使用&amp;。相同的原因对于%也是有效的,因为它通常用于编码char。和=一样,它为参数名称分配了一个值。最后,我想说可以使用这些未编码的代码:

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


但是如果您期望使用随机生成的URL,而不应该使用.!,因为这些URL标记了句子的结尾,并且某些邮件应用程序不会自动链接该URL的最后一个字符。示例:

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


评论


实用的方法-做得好。正在寻找您的最后一个列表-特别是+号:-D

–奥利弗
19年3月22日在15:59

#5 楼

从这里


因此,只有字母数字,特殊字符$-_.+!*'(),
和用于其
保留目的的保留字符可以在URL中未经编码地使用。 >

#6 楼

RFC3986定义了可以在URI中使用的两组字符:



保留的字符::/?#[]@!$&'()*+,;=


reserved = gen-delims / sub-delims

gen-delims =“:” /“ /” /“?” /“#” /“ [” /“]” /“ @”

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

保留字符的目的是提供一组分隔字符,这些字符可与URI中的其他数据区分开。在保留字符替换为其相应的百分比编码八位字节方面不同的URI不等效。




未保留的字符:A-Za-z0-9-_.~


未保留= ALPHA / DIGIT /“-” /“。 /“ _” /“〜”

URI中允许但没有保留用途的字符称为未保留。




#7 楼

这些在RFC3986中列出。请参阅Collected ABNF for URI,以了解在何处允许使用什么以及用于解析/验证的正则表达式。

#8 楼

即将发生的变化是针对中文,阿拉伯域名而不是URI。国际化的URI称为IRI,并且在RFC 3987中进行了定义。不过,我还是建议您不要自己做,而要依赖现有的经过测试的库,因为URI编码/解码有很多选择,哪些被认为是安全的。根据规格,而不是实际使用的安全性(浏览器)。

#9 楼

如果您想给用户一种特殊的体验,可以使用pushState在浏览器的网址中添加各种字符:



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);