URLで使用できる文字


190

誰かがエンコードせずにGET内で使用できる文字の完全なリストを知っていますか?現在、AZ azと0-9を使用していますが、完全なリストを探しています。

私はまた、中国語、アラビア語のurlの今後の追加のためにリリースされた仕様があるかどうかにも興味があります(明らかにそれが私の質問に大きな影響を与えるため)


5
URIで許可される文字は予約済み!*'();:@&=+$,/?#[]または未予約A-Za-z0-9_.~-(または%パーセントエンコーディングの一部としてのパーセント文字)です
Mikl

1
MySQLでは、これREGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'を使用して不正な文字を含むURL文字列を検索します。多分それは他の誰かにも役立つでしょう。
Mikl 2016年

@Mikl:それは正規表現のようには見えません。
Jens Mander

回答:


181

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

5
@Timスラッシュは予約文字であるため、予約された目的(パスの記述、プロトコルの記述など)に使用されている場合は、エスケープする必要はありません。それ以外の場合はそうです。
Myles、2007

4
RFC 1738の一般的な構文規則は、1998年に廃止されました
ユッカ・K. Korpela

3
@ Myles、STD 66(= RFC 3986)は他の回答で言及されています。答えの内容が正しいかどうかは別の問題です。完全なリストを正しく説明している答えはないと思います。
Jukka K.Korpela、2013年

4
またA-Za-z0-9_.-~、この回答の最初に、予約されていない文字と予約されている文字のリストを追加できます。!*'();:@&=+$,/?#[]人々の時間を節約できます
Mikl

2
@basZeroわかりづらいですが、完全な答えは簡単ではありません。それは予約文字であるようで述べたように、あなたの質問への答えは、ノーです:reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
マイルズ

42

URIで許可されている文字は予約済みまたは未予約(またはパーセントエンコーディングの一部としてのパーセント文字)です。

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

これらは言うRFC 3986 予約されていない文字(秒。2.3)と同様に予約文字、彼らは特別な意味を保持する必要がある場合(秒2.2)。また、パーセントエンコーディングの一部としてのパーセント文字。


7
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
jaestevan 2014年

リンクされた文書からの@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 2013年

廃止されたRFC1738はリストされて{}^\~おりbacktick、安全ではありません。また、RFC3986は、\がファイルシステムのために安全でないとリストしています。これは{}^、同様に使用できることを意味します。
mgutt 2017

したがって、たとえば、文字列内URLの終わりを見つけようとしている場合(これは私です)、受け入れられた回答の古い標準を使用するのが最善です... URLを検証している場合は、この回答では文字セットを使用してください。
ashleedawg 2018

注意して、あなたはこれを正規表現文字クラスとして書きました。脱出することを確認します-ので、または文字クラスの最初や最後にそれを置く[.-~]実際には46から126までのすべてのASCII文字が含まれている
KWL

19

私は、ドイツ語のキーボードで使用可能なすべての文字を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、...

そのため、これらの文字はエンコードせずに問題なく使用できます。もちろん、の&;ようなエンコードシーケンスのため、使用すべきではありません&amp;。同じ理由が有効です%、一般的に文字をエンコードするために使用された場合にも当てはまります。そして=、それはパラメータ名に値を割り当てます。

最後に、これらのエンコードされていないものを使用してもかまいません。

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

ただし、ランダムに生成されたURLが予想される場合は、を使用しないでください。.!これらは文の終わりを示し、一部のメールアプリはURLの最後の文字に自動リンクしません。例:

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

実用的なアプローチ-よくできました。あなたの最後のリストを探していました- +特にサイン:-D
Oliver

12

ここから

したがって、英数字、特殊文字$-_.+!*'(), 、および予約目的で使用される予約文字のみが、URL内でエンコードされずに使用できます。



5

RFC3986は、URIで使用できる2つの文字セットを定義しています。

  • 予約文字:/?#[]@!$&'()*+,;=

    予約済み= gen-delims / sub-delims

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

    sub-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.