किसी URL में वर्ण अनुमत हैं


191

क्या कोई ऐसे पात्रों की पूरी सूची जानता है जो बिना एनकोड किए जीईटी के भीतर इस्तेमाल किए जा सकते हैं? फिलहाल मैं AZ az और 0-9 का उपयोग कर रहा हूं ... लेकिन मैं पूरी सूची का पता लगा रहा हूं।

मुझे इस बात में भी दिलचस्पी है कि चीनी, अरबी url (जैसा कि जाहिर है कि मेरे सवाल पर एक बड़ा प्रभाव पड़ेगा) के लिए एक विनिर्देश जारी किया गया है


5
URI में अनुमत वर्ण !*'();:@&=+$,/?#[]या तो आरक्षित या अनारक्षित A-Za-z0-9_.~-(या %प्रतिशत-एन्कोडिंग के भाग के रूप में एक प्रतिशत वर्ण )
मिकाल

1
MySQL में मैं REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'खराब अक्षरों के साथ URL स्ट्रिंग खोजने के लिए इसका उपयोग करता हूं । शायद यह किसी और के लिए भी उपयोगी है।
मिकाल

@ मैक्कल: वह चीज़ शायद ही एक नियमित अभिव्यक्ति की तरह दिखती हो।
जेन्स मैंडर

जवाबों:


182

से आरएफसी 1738 विनिर्देश:

इस प्रकार, केवल अल्फ़ान्यूमेरिक्स, विशेष वर्ण " $-_.+!*'(),", और उनके आरक्षित उद्देश्यों के लिए उपयोग किए जाने वाले वर्णों का उपयोग किसी URL में अनएन्कोड किया जा सकता है।

EDIT: @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
@ टिम स्लैश एक आरक्षित वर्ण है, इसलिए, यदि इसका उपयोग इसके आरक्षित उद्देश्य (पथ को पथभ्रष्ट करने, प्रोटोकॉल परिशोधन ...) के लिए किया जा रहा है, तो इसे भागने की आवश्यकता नहीं है। अन्यथा, यह करता है।
मायल्स

4
1998 में RFC 1738 के सामान्य वाक्यविन्यास नियमों का पालन किया गया था।
जुका के। कोर्पेला

3
@ शैलियाँ, एसटीडी 66 (= RFC 3986) अन्य उत्तरों में वर्णित है। उत्तर की सामग्री सही है या नहीं यह एक अलग मुद्दा है; मुझे नहीं लगता कि कोई भी उत्तर पूरी सूची का सही वर्णन करता है।
जुका के। कोरपेला

4
और आप A-Za-z0-9_.-~इस उत्तर की शुरुआत में अनारक्षित और आरक्षित वर्णों की सूची जोड़ सकते हैं । !*'();:@&=+$,/?#[]यह लोगों के लिए समय बचा सकता है
मिक

2
@basZero मुझे खेद है कि आपने इसे भ्रामक पाया, लेकिन पूर्ण उत्तर सरल नहीं है। आपके प्रश्न का उत्तर नहीं है, क्योंकि यह एक आरक्षित वर्ण है जैसा कि कहा गया है:reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
Myles

42

URI में अनुमत वर्ण या तो आरक्षित या अनारक्षित (या प्रतिशत-एन्कोडिंग के भाग के रूप में एक प्रतिशत वर्ण)

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

यदि ये आरएफसी 3986 अनारक्षित पात्र (सेकंड 2.3) के साथ-साथ आरक्षित वर्ण (सेकंड 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
आप उन आरक्षितों का भी उपयोग कर सकते हैं।
क्वर्टी

अप्रचलित RFC1738 सूचीबद्ध {}^\~और backtickअसुरक्षित के रूप में। और RFC3986 फ़ाइल सिस्टम के कारण असुरक्षित के रूप में सूचीबद्ध करता है। इस साधन {}^का उपयोग किया जा सकता है।
एमगुट

इसलिए यदि आप कहने की कोशिश कर रहे हैं, तो एक स्ट्रिंग के भीतर एक url का अंत ढूंढें (जो मैं हूं), स्वीकृत उत्तर में अप्रचलित मानकों द्वारा जाना सबसे अच्छा होगा ... यदि आप url का सत्यापन कर रहे हैं तो आपको करना चाहिए इस उत्तर पर वर्णों के सेट का उपयोग करें ।
ashleedawg

सावधान, आपने इसे एक नियमित अभिव्यक्ति वर्ण वर्ग के रूप में लिखा है। -चरित्र वर्ग की शुरुआत या अंत में इसे बचाना या रखना सुनिश्चित करें, क्योंकि [.-~]वास्तव में 46 से 126 तक सभी ASCII वर्ण हैं।
kwl

19

मैंने URL पैरामीटर के रूप में अपने जर्मन कीबोर्ड पर सभी उपलब्ध वर्णों के साथ अपनी वेबसाइट (अपाचे) का अनुरोध करके इसका परीक्षण किया:

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

ये एनकोडेड नहीं थे:

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

इसके बाद एन्कोड नहीं किया गया urlencode():

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_

इसके बाद एन्कोड नहीं किया गया rawurlencode():

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~

नोट: PHP से पहले RFC 1738 की वजह से 5.3.0 rawurlencode()एन्कोडेड । लेकिन यह RFC 3986 द्वारा प्रतिस्थापित किया गया था, इसलिए इसका उपयोग करना सुरक्षित है, अब। लेकिन मुझे समझ में नहीं आता है कि उदाहरण के लिए एनकोड क्यों किया जाता है क्योंकि उनका उल्लेख RFC 3986 में नहीं है।~{}rawurlencode()

मेरे द्वारा किया गया एक अतिरिक्त परीक्षण मेल ग्रंथों में ऑटो-लिंकिंग से संबंधित था। मैंने मोज़िला थंडरबर्ड, 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/Wikipedia:About

प्लस
https://plus.google.com/+google

साइन इन करें, बृहदान्त्र, कोमा और विस्मयादिबोधक चिह्न
https: //www.google.com/maps/place/USA/@36.22184545, ...

उसकी वजह से ये चर समस्याओं के बिना उपयोग किए जाने योग्य नहीं होने चाहिए। बेशक आपको &;एन्कोडिंग दृश्यों की तरह उपयोग नहीं करना चाहिए &amp;%जैसा कि सामान्य तौर पर वर्णों को सांकेतिक शब्दों में बदलने के लिए किया जाता था, वैसा ही कारण मान्य है । और =जैसा कि यह एक पैरामीटर नाम के लिए एक मान प्रदान करता है।

अंत में मैं कहना चाहूंगा कि इन अनएन्कोडेड का उपयोग करना ठीक है:

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

लेकिन अगर आप यादृच्छिक रूप से उत्पन्न URL का उपयोग करने की अपेक्षा करते हैं, तो आपको उपयोग नहीं करना चाहिए .!, क्योंकि वे एक वाक्य के अंत को चिह्नित करते हैं और कुछ मेल ऐप्स url के अंतिम चार्ट को ऑटो-लिंक नहीं करेंगे। उदाहरण:

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

व्यावहारिक दृष्टिकोण - अच्छा काम। आपकी अंतिम सूची की तलाश कर रहा था - +विशेष रूप से संकेत :-D
ओलिवर

12

से यहाँ

इस प्रकार, केवल अल्फ़ान्यूमेरिक्स, विशेष वर्ण $-_.+!*'(), और उनके आरक्षित उद्देश्यों के लिए उपयोग किए जाने वाले वर्णों का उपयोग URL के भीतर अनएन्कोड किया जा सकता है।



5

RFC3986 एक URI में आपके द्वारा उपयोग किए जा सकने वाले दो सेटों को परिभाषित करता है:

  • आरक्षित वर्ण ::/?#[]@!$&'()*+,;=

    आरक्षित = जीन-डेलिम्स / सब-डेलिम्स

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

    उप-डेलिम्स = "!" / "$" / "और" / "" "/" ("/") "/" * "/" + "/", "/"; " / "="

    आरक्षित वर्णों का उद्देश्य ऐसे पात्रों का परिसीमन करना है जो किसी URI के भीतर अन्य डेटा से अलग होते हैं। यूआरआई जो कि अपने संबंधित प्रतिशत-एन्कोडेड ऑक्टेट के साथ आरक्षित वर्ण के प्रतिस्थापन में भिन्न हैं, समकक्ष नहीं हैं।

  • अनारक्षित वर्ण :A-Za-z0-9-_.~

    अनारक्षित = अल्फा / DIGIT / "-" / "।" / "_" / "~"

    ऐसे वर्ण जिन्हें यूआरआई में अनुमति दी जाती है लेकिन आरक्षित उद्देश्य नहीं होता है उन्हें अनारक्षित कहा जाता है।


3

आगामी परिवर्तन चीनी, अरबी डोमेन नाम यूआरआई के लिए नहीं है। अंतर्राष्ट्रीय यूआरआई को आईआरआई कहा जाता है और इसे आरएफसी 3987 में परिभाषित किया गया है । हालाँकि, कहा जाता है कि मैं इसे स्वयं नहीं करने की सलाह दूंगा, लेकिन मौजूदा, परीक्षण किए गए पुस्तकालय पर भरोसा करना क्योंकि यूआरआई एन्कोडिंग / डिकोडिंग के बहुत सारे विकल्प हैं और विनिर्देश द्वारा सुरक्षित क्या माना जाता है, बनाम क्या वास्तविक उपयोग (ब्राउज़र) द्वारा सुरक्षित हैं ।


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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.