誰かがエンコードせずにGET内で使用できる文字の完全なリストを知っていますか?現在、AZ azと0-9を使用していますが、完全なリストを探しています。
私はまた、中国語、アラビア語のurlの今後の追加のためにリリースされた仕様があるかどうかにも興味があります(明らかにそれが私の質問に大きな影響を与えるため)
REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
を使用して不正な文字を含むURL文字列を検索します。多分それは他の誰かにも役立つでしょう。
誰かがエンコードせずにGET内で使用できる文字の完全なリストを知っていますか?現在、AZ azと0-9を使用していますが、完全なリストを探しています。
私はまた、中国語、アラビア語のurlの今後の追加のためにリリースされた仕様があるかどうかにも興味があります(明らかにそれが私の質問に大きな影響を与えるため)
REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
を使用して不正な文字を含むURL文字列を検索します。多分それは他の誰かにも役立つでしょう。
回答:
RFC 1738仕様から:
したがって、英数字、特殊文字「
$-_.+!*'(),
」、および予約目的で使用される予約文字のみが、URL内でエンコードされずに使用できます。
編集:@Jukka 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
A-Za-z0-9_.-~
、この回答の最初に、予約されていない文字と予約されている文字のリストを追加できます。!*'();:@&=+$,/?#[]
人々の時間を節約できます
reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
URIで許可されている文字は予約済みまたは未予約(またはパーセントエンコーディングの一部としてのパーセント文字)です。
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
これらは言うRFC 3986 予約されていない文字(秒。2.3)と同様に予約文字、彼らは特別な意味を保持する必要がある場合(秒2.2)。また、パーセントエンコーディングの一部としてのパーセント文字。
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
66の予約されていない文字の完全なリストは、RFC3986にあります。ここ:http : //tools.ietf.org/html/rfc3986#section-2.3
これは、次の正規表現セットの任意の文字です。
[A-Za-z0-9_.\-~]
{}^\~
おりbacktick
、安全ではありません。また、RFC3986は、\がファイルシステムのために安全でないとリストしています。これは{}^
、同様に使用できることを意味します。
-
ので、または文字クラスの最初や最後にそれを置く[.-~]
実際には46から126までのすべてのASCII文字が含まれている
私は、ドイツ語のキーボードで使用可能なすべての文字をURLパラメータとしてWebサイト(Apache)に要求することでテストしました。
http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~
これらはエンコードされませんでした:
^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~
後にエンコードされませんurlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_
後にエンコードされませんrawurlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~
注意:PHP 5.3.0以前rawurlencode()
エンコード~
のため RFC 1738の。しかし、これはRFC 3986に置き換えられたため、今は安全に使用できます。しかし、たとえばRFC 3986で言及されていないため、たとえば{}
エンコードされる理由がわかりませんrawurlencode()
。
私が行った追加のテストは、メールテキストの自動リンクに関するものでした。私はMozilla Thunderbird、aol.com、outlook.com、gmail.com、gmx.de、yahoo.deをテストし、これらの文字を含むURLを完全にリンクしました:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@
もちろん、それ?
もリンクされていましたが、一度使用された場合のみです。
rawurlencode()
文字だけを使用するように提案する人もいますが、誰かがこれらのWebサイトを開くのに問題があると聞いたことはありますか?
アスタリスク
http://wayback.archive.org/web/*/http://google.com
結腸
https://en.wikipedia.org/wiki/Wikipedia:About
プラス
https://plus.google.com/+google
アットマーク、コロン、コンマ、感嘆符
https://www.google.com/maps/place/USA/@36.2218457、...
そのため、これらの文字はエンコードせずに問題なく使用できます。もちろん、の&;
ようなエンコードシーケンスのため、使用すべきではありません&
。同じ理由が有効です%
、一般的に文字をエンコードするために使用された場合にも当てはまります。そして=
、それはパラメータ名に値を割り当てます。
最後に、これらのエンコードされていないものを使用してもかまいません。
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@
ただし、ランダムに生成されたURLが予想される場合は、を使用しないでください。.!
これらは文の終わりを示し、一部のメールアプリはURLの最後の文字に自動リンクしません。例:
Visit http://example.com/foo=bar! !
+
特にサイン:-D
RFC3986は、URIで使用できる2つの文字セットを定義しています。
予約文字::/?#[]@!$&'()*+,;=
予約済み= gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "、" / ";" / "="
予約文字の目的は、URI内の他のデータと区別できる一連の区切り文字を提供することです。予約文字とそれに対応するパーセントエンコードされたオクテットの置き換えが異なるURIは同等ではありません。
予約されていない文字:A-Za-z0-9-_.~
予約なし= ALPHA / DIGIT / "-" / "。" / "_" / "〜"
URIで許可されているが予約された目的がない文字は、予約されていないと呼ばれます。
!*'();:@&=+$,/?#[]
または未予約A-Za-z0-9_.~-
(または%
パーセントエンコーディングの一部としてのパーセント文字)です