C # का उपयोग करते हुए URL एनकोडिंग


340

मेरे पास एक एप्लिकेशन है जो वीबी फोरम सॉफ़्टवेयर में एक पोस्ट अनुरोध भेजता है और किसी को (कुकीज़ या कुछ भी स्थापित किए बिना) लॉग करता है।

उपयोगकर्ता द्वारा लॉग इन करने के बाद, मैं एक वैरिएबल बनाता हूं जो उनके स्थानीय मशीन पर एक पथ बनाता है।

c: \ tempfolder \ तिथि \ username

समस्या यह है कि कुछ उपयोगकर्ता नाम "अवैध वर्ण" अपवाद को फेंक रहे हैं। उदाहरण के लिए अगर मेरा उपयोगकर्ता नाम था तो mas|fenixयह एक अपवाद होगा।

Path.Combine( _      
  Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), _
  DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username)

मैं इसे स्ट्रिंग से निकालना नहीं चाहता, लेकिन सर्वर पर FTP के माध्यम से उनके उपयोगकर्ता नाम वाला एक फ़ोल्डर बनाया जाता है। और यह मेरा दूसरा सवाल है। अगर मैं सर्वर पर एक फ़ोल्डर बना रहा हूँ तो क्या मैं "अवैध वर्ण" छोड़ सकता हूँ? मैं केवल यह पूछता हूं क्योंकि सर्वर लिनक्स आधारित है, और मुझे यकीन नहीं है कि लिनक्स इसे स्वीकार करता है या नहीं।

संपादित करें: ऐसा लगता है कि URL एनकोड वह नहीं है जो मैं चाहता हूं .. यहां वह है जो मैं करना चाहता हूं:

old username = mas|fenix
new username = mas%xxfenix

जहाँ% xx ASCII मान या कोई अन्य मान है जो आसानी से वर्ण की पहचान करेगा।


इस को शामिल फाइल सिस्टम सुरक्षित फ़ोल्डर नाम बनाने के लिए: http://stackoverflow.com/questions/333175/is-there-a-way-of-making-strings-file-path-safe-in-c
missaghi

जवाबों:


191

संपादित करें: ध्यान दें कि यह उत्तर अब पुराना है। देखें नीचे सिआर्ही Kuchuk का जवाब एक बेहतर सुधार के लिए

UrlEncoding वही करेगी जो आप यहाँ सुझा रहे हैं। सी # के साथ, आप बस का उपयोग करें HttpUtility, जैसा कि उल्लेख किया गया है।

आप अवैध वर्णों को फिर से जोड़ सकते हैं और फिर प्रतिस्थापित कर सकते हैं, लेकिन यह कहीं अधिक जटिल हो जाता है, क्योंकि आपके पास सही वर्णों के साथ बदलने के लिए राज्य मशीन (स्विच ... केस, उदाहरण के लिए) का कोई रूप होना चाहिए। चूंकि UrlEncodeयह सामने है, यह आसान है।

जैसा कि लिनक्स बनाम विंडोज़ के लिए, कुछ ऐसे वर्ण हैं जो लिनक्स में स्वीकार्य हैं जो विंडोज़ में नहीं हैं, लेकिन मुझे इस बारे में चिंता नहीं होगी, क्योंकि फ़ोल्डर नाम को यूआरएल स्ट्रिंग को डिकोड करके वापस लौटाया जा सकता है UrlDecode, इसलिए, आप यात्रा को गोल कर सकते हैं परिवर्तन।


5
यह उत्तर अभी पुराना है। नीचे कुछ उत्तर पढ़ें - .net45 के रूप में यह सही समाधान हो सकता है: msdn.microsoft.com/en-us/library/…
blueberryfields

1
FTP के लिए प्रत्येक Uri भाग (फ़ोल्डर या फ़ाइल नाम) का निर्माण Uri.EscapeDataString (fileOrFolderName) का उपयोग करके किया जा सकता है जो सभी गैर उड़ी संगत चरित्र (रिक्त स्थान, यूनिकोड ...) की अनुमति देता है। उदाहरण के लिए फ़ाइल नाम में किसी भी वर्ण को अनुमति देने के लिए, उपयोग करें: req = (FtpWebRequest) WebRequest.Create (नया Uri (पथ + "/" + Uri.EscapeDataString (फ़ाइल नाम)); HttpUtility.UrlEncode () प्लस चिन्हों (+) द्वारा रिक्त स्थान बदलें। खोज इंजन के लिए एक सही व्यवहार लेकिन फ़ाइल / फ़ोल्डर नामों के लिए गलत।
रेनॉड बैंसेल

जब आप कभी भी js स्क्रिप्ट जोड़ने का प्रयास करते हैं, तो asp.net url में अधिकांश xss को ब्लॉक कर देता है A potentially dangerous Request.Path value was detected from the client
सीखना

510

मैं URL एन्कोडिंग के लिए विभिन्न तरीकों .NET प्रदान के साथ प्रयोग कर रहा हूं। शायद निम्न तालिका उपयोगी होगी (जैसा कि मैंने लिखा परीक्षण ऐप से आउटपुट):

Unencoded UrlEncoded UrlEncodedUnicode UrlPathEncoded EscapedDataString EscapedUriString HtmlEncoded HtmlAttributeEncoded HexEscaped
A         A          A                 A              A                 A                A           A                    %41
B         B          B                 B              B                 B                B           B                    %42

a         a          a                 a              a                 a                a           a                    %61
b         b          b                 b              b                 b                b           b                    %62

0         0          0                 0              0                 0                0           0                    %30
1         1          1                 1              1                 1                1           1                    %31

[space]   +          +                 %20            %20               %20              [space]     [space]              %20
!         !          !                 !              !                 !                !           !                    %21
"         %22        %22               "              %22               %22              "      "               %22
#         %23        %23               #              %23               #                #           #                    %23
$         %24        %24               $              %24               $                $           $                    %24
%         %25        %25               %              %25               %25              %           %                    %25
&         %26        %26               &              %26               &                &       &                %26
'         %27        %27               '              '                 '                '       '                %27
(         (          (                 (              (                 (                (           (                    %28
)         )          )                 )              )                 )                )           )                    %29
*         *          *                 *              %2A               *                *           *                    %2A
+         %2b        %2b               +              %2B               +                +           +                    %2B
,         %2c        %2c               ,              %2C               ,                ,           ,                    %2C
-         -          -                 -              -                 -                -           -                    %2D
.         .          .                 .              .                 .                .           .                    %2E
/         %2f        %2f               /              %2F               /                /           /                    %2F
:         %3a        %3a               :              %3A               :                :           :                    %3A
;         %3b        %3b               ;              %3B               ;                ;           ;                    %3B
<         %3c        %3c               <              %3C               %3C              &lt;        &lt;                 %3C
=         %3d        %3d               =              %3D               =                =           =                    %3D
>         %3e        %3e               >              %3E               %3E              &gt;        >                    %3E
?         %3f        %3f               ?              %3F               ?                ?           ?                    %3F
@         %40        %40               @              %40               @                @           @                    %40
[         %5b        %5b               [              %5B               %5B              [           [                    %5B
\         %5c        %5c               \              %5C               %5C              \           \                    %5C
]         %5d        %5d               ]              %5D               %5D              ]           ]                    %5D
^         %5e        %5e               ^              %5E               %5E              ^           ^                    %5E
_         _          _                 _              _                 _                _           _                    %5F
`         %60        %60               `              %60               %60              `           `                    %60
{         %7b        %7b               {              %7B               %7B              {           {                    %7B
|         %7c        %7c               |              %7C               %7C              |           |                    %7C
}         %7d        %7d               }              %7D               %7D              }           }                    %7D
~         %7e        %7e               ~              ~                 ~                ~           ~                    %7E

Ā         %c4%80     %u0100            %c4%80         %C4%80            %C4%80           Ā           Ā                    [OoR]
ā         %c4%81     %u0101            %c4%81         %C4%81            %C4%81           ā           ā                    [OoR]
Ē         %c4%92     %u0112            %c4%92         %C4%92            %C4%92           Ē           Ē                    [OoR]
ē         %c4%93     %u0113            %c4%93         %C4%93            %C4%93           ē           ē                    [OoR]
Ī         %c4%aa     %u012a            %c4%aa         %C4%AA            %C4%AA           Ī           Ī                    [OoR]
ī         %c4%ab     %u012b            %c4%ab         %C4%AB            %C4%AB           ī           ī                    [OoR]
Ō         %c5%8c     %u014c            %c5%8c         %C5%8C            %C5%8C           Ō           Ō                    [OoR]
ō         %c5%8d     %u014d            %c5%8d         %C5%8D            %C5%8D           ō           ō                    [OoR]
Ū         %c5%aa     %u016a            %c5%aa         %C5%AA            %C5%AA           Ū           Ū                    [OoR]
ū         %c5%ab     %u016b            %c5%ab         %C5%AB            %C5%AB           ū           ū                    [OoR]

कॉलम निम्नानुसार एनकोडिंग का प्रतिनिधित्व करते हैं:

  • urlencoded: HttpUtility.UrlEncode

  • UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode

  • UrlPathEncoded: HttpUtility.UrlPathEncode

  • EscapedDataString: Uri.EscapeDataString

  • EscapedUriString: Uri.EscapeUriString

  • HtmlEncoded: HttpUtility.HtmlEncode

  • HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode

  • HexEscaped: Uri.HexEscape

टिप्पणियाँ:

  1. HexEscapeकेवल पहले 255 अक्षरों को ही संभाल सकता है। इसलिए यह ArgumentOutOfRangeलैटिन ए-एक्सटेंडेड कैरेक्टर्स (जैसे exception) के लिए एक अपवाद फेंकता है ।

  2. यह तालिका .NET 4.0 में तैयार की गई थी (नीचे लेवी बॉटलो की टिप्पणी देखें जो कहती है कि .NET 4.5 में एन्कोडिंग थोड़ा अलग है)।

संपादित करें:

मैंने .NET 4.5 के एन्कोडिंग्स के साथ एक दूसरी तालिका जोड़ी है। इस उत्तर को देखें: https://stackoverflow.com/a/21771206/216440

संपादित करें 2:

चूंकि लोग इन तालिकाओं की सराहना करते हैं, मुझे लगा कि आप स्रोत कोड पसंद कर सकते हैं जो तालिका उत्पन्न करता है, इसलिए आप अपने आसपास खेल सकते हैं। यह एक सरल C # कंसोल एप्लिकेशन है, जो .NET 4.0 या 4.5 को लक्षित कर सकता है:

using System;
using System.Collections.Generic;
using System.Text;
// Need to add a Reference to the System.Web assembly.
using System.Web;

namespace UriEncodingDEMO2
{
    class Program
    {
        static void Main(string[] args)
        {
            EncodeStrings();

            Console.WriteLine();
            Console.WriteLine("Press any key to continue...");
            Console.Read();
        }

        public static void EncodeStrings()
        {
            string stringToEncode = "ABCD" + "abcd"
            + "0123" + " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" + "ĀāĒēĪīŌōŪū";

            // Need to set the console encoding to display non-ASCII characters correctly (eg the 
            //  Latin A-Extended characters such as ĀāĒē...).
            Console.OutputEncoding = Encoding.UTF8;

            // Will also need to set the console font (in the console Properties dialog) to a font 
            //  that displays the extended character set correctly.
            // The following fonts all display the extended characters correctly:
            //  Consolas
            //  DejaVu Sana Mono
            //  Lucida Console

            // Also, in the console Properties, set the Screen Buffer Size and the Window Size 
            //  Width properties to at least 140 characters, to display the full width of the 
            //  table that is generated.

            Dictionary<string, Func<string, string>> columnDetails =
                new Dictionary<string, Func<string, string>>();
            columnDetails.Add("Unencoded", (unencodedString => unencodedString));
            columnDetails.Add("UrlEncoded",
                (unencodedString => HttpUtility.UrlEncode(unencodedString)));
            columnDetails.Add("UrlEncodedUnicode",
                (unencodedString => HttpUtility.UrlEncodeUnicode(unencodedString)));
            columnDetails.Add("UrlPathEncoded",
                (unencodedString => HttpUtility.UrlPathEncode(unencodedString)));
            columnDetails.Add("EscapedDataString",
                (unencodedString => Uri.EscapeDataString(unencodedString)));
            columnDetails.Add("EscapedUriString",
                (unencodedString => Uri.EscapeUriString(unencodedString)));
            columnDetails.Add("HtmlEncoded",
                (unencodedString => HttpUtility.HtmlEncode(unencodedString)));
            columnDetails.Add("HtmlAttributeEncoded",
                (unencodedString => HttpUtility.HtmlAttributeEncode(unencodedString)));
            columnDetails.Add("HexEscaped",
                (unencodedString
                    =>
                    {
                        // Uri.HexEscape can only handle the first 255 characters so for the 
                        //  Latin A-Extended characters, such as A, it will throw an 
                        //  ArgumentOutOfRange exception.                       
                        try
                        {
                            return Uri.HexEscape(unencodedString.ToCharArray()[0]);
                        }
                        catch
                        {
                            return "[OoR]";
                        }
                    }));

            char[] charactersToEncode = stringToEncode.ToCharArray();
            string[] stringCharactersToEncode = Array.ConvertAll<char, string>(charactersToEncode,
                (character => character.ToString()));
            DisplayCharacterTable<string>(stringCharactersToEncode, columnDetails);
        }

        private static void DisplayCharacterTable<TUnencoded>(TUnencoded[] unencodedArray,
            Dictionary<string, Func<TUnencoded, string>> mappings)
        {
            foreach (string key in mappings.Keys)
            {
                Console.Write(key.Replace(" ", "[space]") + " ");
            }
            Console.WriteLine();

            foreach (TUnencoded unencodedObject in unencodedArray)
            {
                string stringCharToEncode = unencodedObject.ToString();
                foreach (string columnHeader in mappings.Keys)
                {
                    int columnWidth = columnHeader.Length + 1;
                    Func<TUnencoded, string> encoder = mappings[columnHeader];
                    string encodedString = encoder(unencodedObject);

                    // ASSUMPTION: Column header will always be wider than encoded string.
                    Console.Write(encodedString.Replace(" ", "[space]").PadRight(columnWidth));
                }
                Console.WriteLine();
            }
        }
    }
}

2
यह एक शानदार जवाब है। पता चला कि मैं Uri.EscapeDataString का उपयोग करना चाहता था और इसमें System.Web शामिल नहीं है। इस तालिका के लिए धन्यवाद।
सेरावी

7
ध्यान दें कि यह अब 100% सटीक नहीं है। .NET 4 और .NET 4.5 के बीच कुछ फ़ंक्शन थोड़े बदल गए हैं। Stackoverflow.com/q/20003106/1068266 देखें ।
लेवी मोटेलो

2
@ लेवी: सिर ऊपर करने के लिए धन्यवाद। मैंने .NET 4.5 के लिए तालिका के साथ एक दूसरा उत्तर जोड़ा है। मैंने दूसरी तालिका से लिंक करने के लिए मूल उत्तर को संपादित किया है।
साइमन टवेसी

ध्यान दें कि .NET प्रलेखन कहता है कि उपयोग न करें; केवल ब्राउज़र संगतता के लिए अभिप्रेत है। UrlEncode का उपयोग करें। , लेकिन यह विधि बहुत सारे अन्य अवांछित पात्रों को कूटबद्ध करती है। निकटतम एक है Uri.EscapeUriString, लेकिन सावधान रहें यह एक nullतर्क का समर्थन नहीं करता है।
एंड्रयू

1
मैं उल्लेख करने के लिए, मेरी टिप्पणी से ऊपर के लिए है भूल गया UrlPathEncode। तो मूल रूप से UrlPathEncodeसाथ बदलें Uri.EscapeUriString
एंड्रयू

278

आपको केवल उपयोगकर्ता नाम या URL के अन्य भाग को एनकोड करना चाहिए जो अमान्य हो सकता है। URL को एन्कोडिंग करने से समस्याएँ हो सकती हैं क्योंकि कुछ इस तरह से होता है:

string url = HttpUtility.UrlEncode("http://www.google.com/search?q=Example");

निकलेगा

http% 3a% 2f% 2fwww.google.com% 2fsearch% 3fq% 3dExample

यह स्पष्ट रूप से अच्छी तरह से काम नहीं करने वाला है। इसके बजाय, आपको क्वेरी स्ट्रिंग में केवल कुंजी / मान जोड़े का मान एनकोड करना चाहिए:

string url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");

उम्मीद है कि मदद करता है। जैसा कि टेडेय ने उल्लेख किया है, आपको अभी भी यह सुनिश्चित करने की आवश्यकता होगी कि अवैध फ़ाइल-नाम वर्ण हटा दिए गए हैं या फिर फ़ाइल सिस्टम पथ को पसंद नहीं करेगा।


33
HttpUtility.UrlPathEncode पद्धति का उपयोग करके आपको यहां बताई गई समस्या को रोकना चाहिए।
विप्रतिर्ति

12
@DJ पीरटु: यह सच है कि UrlPathEncode पथ में उन अवांछित परिवर्तनों को नहीं करेगा, हालाँकि यह कुछ भी सांकेतिक शब्दों में बदलना नहीं होगा ?(क्योंकि यह मानता है कि स्ट्रिंग स्ट्रिंग पहले से एन्कोडेड है)। डैन हर्बर्ट के उदाहरण में ऐसा लग रहा है कि वह नाटक कर रहा है वह Exampleपाठ है जिसे एन्कोडिंग की आवश्यकता है, इसलिए HttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");काम नहीं करेगा। इसके साथ प्रयास करें ?q=Ex&ple(जहां वांछित परिणाम है ?q=Ex%26ple)। यह काम नहीं करेगा क्योंकि (1) UrlPathEncode के बाद कुछ भी नहीं छूता है? , और (2) UrlPathEncode &वैसे भी सांकेतिक शब्दों में बदलना नहीं करता है।
टिम गुडमैन

1
यहाँ देखें: connect.microsoft.com/VisualStudio/feedback/details/551839/… ... मुझे यह जोड़ना चाहिए कि बेशक यह अच्छा है कि UrlPathEncode सांकेतिक शब्दों में बदलना नहीं करता है &, क्योंकि आपको अपने क्वेरी पैरामीटर को सीमांकित करने की आवश्यकता है। लेकिन ऐसे समय होते हैं जब आप ampersands को एन्कोडेड करना चाहते हैं।
टिम गुडमैन

10
HttpUtility नवीनतम संस्करणों में WebUtility द्वारा सफल होती है, अपने आप को कुछ समय बचाएं :)
Wiseman

190

बेहतर तरीका है इस्तेमाल करना

Uri.EscapeUriString

.net 4 की पूर्ण प्रोफ़ाइल का संदर्भ नहीं देना है।


1
पूरी तरह सहमत हूँ के बाद से अक्सर "ग्राहकों का प्रोफाइल" System.Net लेकिन System.Web का उपयोग नहीं कर ;-) उपयोग करने वाले एप्लिकेशन के लिए पर्याप्त है
hfrmobile

6
ओपी इसे फ़ाइल सिस्टम संगतता के लिए जाँचने की बात कर रहा है, इसलिए यह काम नहीं करेगा। Windows का अस्वीकृत वर्ण सेट '["/", "\\", "<", ">", ":", "\" "," | ","? "," * "] है, लेकिन इनमें से कई हैं? EscapedUriString (नीचे दी गई तालिका देखें - उस तालिका @Simon Tewsi के लिए धन्यवाद) का उपयोग करके एन्कोडेड न हों ... "उनके स्थानीय मशीन पर एक पथ बनाता है" -ओर्लिप्कोकोड लगभग सभी समस्याओं का ख्याल रखता है, लेकिन वे इसे हल नहीं करते हैं मूल इनपुट में "%" या "% 3f" होने की समस्या, "डिकोड" के रूप में अब मूल से भिन्न होगी।
m1m1k

6
बस यह स्पष्ट करने के लिए: फ़ाइल सिस्टम के लिए इस उत्तर को काम करें
m1m1k

1
इसके अलावा, .NET फ्रेमवर्क 4.5 के साथ शुरू करके, क्लाइंट प्रोफाइल को बंद कर दिया गया है और केवल पूर्ण पुनर्वितरण पैकेज उपलब्ध है।
जुड़वां

29
stackoverflow.com/a/34189188/3436164 इस टिप्पणी का उपयोग Uri.EscapeDataStringन करें Uri.EscapeUriString, इससे मुझे मदद मिली।
यकद्रु

181

चूंकि .NET फ्रेमवर्क 4.5 और नेट स्टैंडर्ड 1.0 का उपयोग करना चाहिए WebUtility.UrlEncode। विकल्पों पर लाभ:

  1. यह .NET फ्रेमवर्क 4.5+, .NET कोर 1.0+, .NET मानक 1.0+, UWP 10.0+ और सभी Xamarin प्लेटफार्मों का भी हिस्सा है। HttpUtility, जबकि .NET फ्रेमवर्क में उपलब्ध होने से पहले (.NET फ्रेमवर्क 1.1+), अन्य प्लेटफार्मों पर बहुत बाद में उपलब्ध होता है (.NET कोर 2.0+, .NET मानक 2.0+) और यह अभी भी UWP में अनुपलब्ध है ( संबंधित प्रश्न देखें )।

  2. .NET फ्रेमवर्क में, यह अंदर रहता हैSystem.dll , इसलिए इसके विपरीत किसी भी अतिरिक्त संदर्भ की आवश्यकता नहीं है HttpUtility

  3. यह ठीक से URL के लिए वर्णों से बच जाता है , इसके विपरीत Uri.EscapeUriString( drweb86 के उत्तर के लिए टिप्पणियां देखें )।

  4. यह स्ट्रिंग की लंबाई पर कोई सीमा नहीं है , के विपरीत Uri.EscapeDataString(देखें संबंधित सवाल तो यह, पोस्ट अनुरोध के लिए इस्तेमाल किया जा सकता उदाहरण के लिए,)।


मुझे रिक्त स्थान के लिए% 20 के बजाय "+" का उपयोग करने का तरीका पसंद है .. लेकिन यह अभी भी URL से "नहीं निकालता है" और मुझे अमान्य URL देता है ... ओह ठीक है .. बस एक को प्रतिस्थापित करना है (" "" "", "")
पिओटर कुला

84

लेवी मोटेलो ने टिप्पणी की कि एनकोडिंग की तालिका जो पहले उत्पन्न हुई थी, अब .NET 4.5 के लिए सटीक नहीं है, क्योंकि एन्कोडिंग .NET 4.0 और 4.5 के बीच थोड़ा बदल गया है। इसलिए मैंने .NET 4.5 के लिए तालिका को फिर से बनाया है:

Unencoded UrlEncoded UrlEncodedUnicode UrlPathEncoded WebUtilityUrlEncoded EscapedDataString EscapedUriString HtmlEncoded HtmlAttributeEncoded WebUtilityHtmlEncoded HexEscaped
A         A          A                 A              A                    A                 A                A           A                    A                     %41
B         B          B                 B              B                    B                 B                B           B                    B                     %42

a         a          a                 a              a                    a                 a                a           a                    a                     %61
b         b          b                 b              b                    b                 b                b           b                    b                     %62

0         0          0                 0              0                    0                 0                0           0                    0                     %30
1         1          1                 1              1                    1                 1                1           1                    1                     %31

[space]   +          +                 %20            +                    %20               %20              [space]     [space]              [space]               %20
!         !          !                 !              !                    %21               !                !           !                    !                     %21
"         %22        %22               "              %22                  %22               %22              &quot;      &quot;               &quot;                %22
#         %23        %23               #              %23                  %23               #                #           #                    #                     %23
$         %24        %24               $              %24                  %24               $                $           $                    $                     %24
%         %25        %25               %              %25                  %25               %25              %           %                    %                     %25
&         %26        %26               &              %26                  %26               &                &amp;       &amp;                &amp;                 %26
'         %27        %27               '              %27                  %27               '                &#39;       &#39;                &#39;                 %27
(         (          (                 (              (                    %28               (                (           (                    (                     %28
)         )          )                 )              )                    %29               )                )           )                    )                     %29
*         *          *                 *              *                    %2A               *                *           *                    *                     %2A
+         %2b        %2b               +              %2B                  %2B               +                +           +                    +                     %2B
,         %2c        %2c               ,              %2C                  %2C               ,                ,           ,                    ,                     %2C
-         -          -                 -              -                    -                 -                -           -                    -                     %2D
.         .          .                 .              .                    .                 .                .           .                    .                     %2E
/         %2f        %2f               /              %2F                  %2F               /                /           /                    /                     %2F
:         %3a        %3a               :              %3A                  %3A               :                :           :                    :                     %3A
;         %3b        %3b               ;              %3B                  %3B               ;                ;           ;                    ;                     %3B
<         %3c        %3c               <              %3C                  %3C               %3C              &lt;        &lt;                 &lt;                  %3C
=         %3d        %3d               =              %3D                  %3D               =                =           =                    =                     %3D
>         %3e        %3e               >              %3E                  %3E               %3E              &gt;        >                    &gt;                  %3E
?         %3f        %3f               ?              %3F                  %3F               ?                ?           ?                    ?                     %3F
@         %40        %40               @              %40                  %40               @                @           @                    @                     %40
[         %5b        %5b               [              %5B                  %5B               [                [           [                    [                     %5B
\         %5c        %5c               \              %5C                  %5C               %5C              \           \                    \                     %5C
]         %5d        %5d               ]              %5D                  %5D               ]                ]           ]                    ]                     %5D
^         %5e        %5e               ^              %5E                  %5E               %5E              ^           ^                    ^                     %5E
_         _          _                 _              _                    _                 _                _           _                    _                     %5F
`         %60        %60               `              %60                  %60               %60              `           `                    `                     %60
{         %7b        %7b               {              %7B                  %7B               %7B              {           {                    {                     %7B
|         %7c        %7c               |              %7C                  %7C               %7C              |           |                    |                     %7C
}         %7d        %7d               }              %7D                  %7D               %7D              }           }                    }                     %7D
~         %7e        %7e               ~              %7E                  ~                 ~                ~           ~                    ~                     %7E

Ā         %c4%80     %u0100            %c4%80         %C4%80               %C4%80            %C4%80           Ā           Ā                    Ā                     [OoR]
ā         %c4%81     %u0101            %c4%81         %C4%81               %C4%81            %C4%81           ā           ā                    ā                     [OoR]
Ē         %c4%92     %u0112            %c4%92         %C4%92               %C4%92            %C4%92           Ē           Ē                    Ē                     [OoR]
ē         %c4%93     %u0113            %c4%93         %C4%93               %C4%93            %C4%93           ē           ē                    ē                     [OoR]
Ī         %c4%aa     %u012a            %c4%aa         %C4%AA               %C4%AA            %C4%AA           Ī           Ī                    Ī                     [OoR]
ī         %c4%ab     %u012b            %c4%ab         %C4%AB               %C4%AB            %C4%AB           ī           ī                    ī                     [OoR]
Ō         %c5%8c     %u014c            %c5%8c         %C5%8C               %C5%8C            %C5%8C           Ō           Ō                    Ō                     [OoR]
ō         %c5%8d     %u014d            %c5%8d         %C5%8D               %C5%8D            %C5%8D           ō           ō                    ō                     [OoR]
Ū         %c5%aa     %u016a            %c5%aa         %C5%AA               %C5%AA            %C5%AA           Ū           Ū                    Ū                     [OoR]
ū         %c5%ab     %u016b            %c5%ab         %C5%AB               %C5%AB            %C5%AB           ū           ū                    ū                     [OoR]

कॉलम निम्नानुसार एनकोडिंग का प्रतिनिधित्व करते हैं:

  • urlencoded: HttpUtility.UrlEncode
  • UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode
  • UrlPathEncoded: HttpUtility.UrlPathEncode
  • WebUtilityUrlEncoded: WebUtility.UrlEncode
  • EscapedDataString: Uri.EscapeDataString
  • EscapedUriString: Uri.EscapeUriString
  • HtmlEncoded: HttpUtility.HtmlEncode
  • HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode
  • WebUtilityHtmlEncoded: WebUtility.HtmlEncode
  • HexEscaped: Uri.HexEscape

टिप्पणियाँ:

  1. HexEscape केवल पहले 255 अक्षरों को संभाल सकता है। इसलिए यह लैटिन ए-एक्सटेंडेड कैरेक्टर (जैसे Ā) के लिए एक ArgumentOutOfRange अपवाद फेंकता है।

  2. यह तालिका .NET 4.5 में उत्पन्न हुई थी (देखें । .NET 4.0 और उसके नीचे प्रासंगिक एन्कोडिंग के लिए ( https://stackoverflow.com/a/11236038/216440 देखें)।

संपादित करें:

  1. Discord के उत्तर के परिणामस्वरूप मैंने नए WebUtility UrlEncode और HtmlEncode विधियाँ जोड़ीं, जो .NET 4.5 में प्रस्तुत की गईं।

2
कोई उपयोगकर्ता नहीं UrlPathEncode - यहां तक ​​कि MSDN का कहना है कि इसका उपयोग नहीं किया जाना है। यह netscape 2 msdn.microsoft.com/en-us/library/…
Jeff

क्या Server.URLEncode अभी तक इस विषय पर एक और भिन्नता है? क्या यह कोई अलग आउटपुट उत्पन्न करता है?
फ्लेक्सिंथेलोस

2
@ALEX: ASP.NET में सर्वर ऑब्जेक्ट HttpServerUtility का एक उदाहरण है। DotPeek decompiler का उपयोग करते हुए मैंने HttpServerUtility.UrlEncode पर एक नज़र डाली। यह सिर्फ HttpUtility.UrlEncode कहता है, इसलिए दोनों विधियों का आउटपुट समान होगा।
साइमन टेवेसी

ऐसा लगता है, यहां तक ​​कि एन्कोडिंग विधियों के इस अतिरेक के साथ, वे सभी अभी भी लैटिन -1 के ऊपर की किसी भी चीज़ के लिए बहुत शानदार ढंग से विफल होते हैं, जैसे कि → या with। (UrlEncodedUnicode ऐसा लगता है कि यह कम से कम यूनिकोड का समर्थन करने की कोशिश करता है, लेकिन पदावनत / लापता है।)
बैरनरी

साइमन, क्या आप इस उत्तर को स्वीकार किए गए उत्तर में एकीकृत कर सकते हैं? इसे एक उत्तर में रखना अच्छा रहेगा। आप इसे एकीकृत कर सकते हैं और उस उत्तर के तल में एक एच 1 हेडिंग बना सकते हैं, या एक टेबल में एकीकृत कर सकते हैं, और विभिन्न लाइनों को चिह्नित कर सकते हैं, जैसे: (Net4.0) ? %3f................................ (Net4.5) ? %3f ..................................
T.Todua

60

यूआरएल में एनकोडिंग आसान है। उपयोग:

System.Web.HttpUtility.UrlEncode(string url)

यदि वह फ़ोल्डर नाम प्राप्त करने के लिए डिकोड किया जाएगा, तो आपको अभी भी उन वर्णों को बाहर करना होगा जो फ़ोल्डर नामों (*;; /?, आदि) में उपयोग नहीं किए जा सकते हैं।


क्या यह हर वर्ण को वर्णमाला का हिस्सा नहीं बनाता है?
मासफेनिक्स

1
URL एन्कोडिंग उन वर्णों को रूपांतरित करता है जो URL में वर्ण-इकाई समकक्षों में अनुमत नहीं होते हैं। असुरक्षित पात्रों की सूची: blooberry.com/indexdot/html/topics/urlencoding.htm
इयान रॉबिन्सन


11
पूर्ण System.Web ... आपके उत्तर में भाग लगाना अच्छा है, यह बहुत से लोगों को थोड़ा समय बचाता है :) धन्यवाद
Liam

3
यह खतरनाक है: url के सभी वर्णों को एनकोड नहीं करना पड़ता है, केवल querystring के मापदंडों का मान होता है। जिस तरह से आप सुझाव देते हैं वह भी एन्कोड करेगा और क्वेरिस्ट्रिंग में कई पैरामीटर बनाने के लिए आवश्यक है। जरूरत पड़ने पर मापदंडों के प्रत्येक मूल्य को सांकेतिक शब्दों में बदलना है
मार्को स्टेफोली

12

यदि आप System.Web नहीं देख पा रहे हैं, तो अपनी प्रोजेक्ट सेटिंग बदलें। ".NET फ्रेमवर्क 4 क्लाइंट प्रोफाइल" के बजाय लक्ष्य रूपरेखा ".NET फ्रेमवर्क 4" होनी चाहिए।


1
मेरी राय में डेवलपर्स को ".NET प्रोफाइल" के बारे में पता होना चाहिए और उन्हें अपने उद्देश्यों के लिए सही उपयोग करना चाहिए ! पूर्ण प्रोफ़ाइल जोड़ने के लिए (उदाहरण के लिए System.Web) प्राप्त करने के लिए वास्तव में यह जानने के बिना कि वे पूर्ण प्रोफ़ाइल क्यों जोड़ते हैं, बहुत स्मार्ट नहीं है। अपने क्लाइंट ऐप्स के लिए "क्लाइंट प्रोफाइल" का उपयोग करें और केवल जब आवश्यक हो तो पूर्ण प्रोफ़ाइल (जैसे एक WinForms या WPF क्लाइंट को क्लाइंट प्रोफ़ाइल का उपयोग करना चाहिए और पूर्ण प्रोफ़ाइल नहीं)! जैसे मुझे क्लाइंट ऐप में HttpServerUtility का उपयोग करने का कोई कारण नहीं दिखाई देता है ^ ^ ... यदि इसकी आवश्यकता है तो ऐप के डिज़ाइन में कुछ गड़बड़ है!
hfrmobile

4
वास्तव में? क्या कभी URL बनाने के लिए क्लाइंट ऐप की आवश्यकता नहीं है? आप एक जीवित - चौकीदार कर्तव्यों के लिए क्या करते हैं?
स्परकेटबॉय

@hfrmobile: नहीं। यह प्रोफाइल मॉडल के साथ सभी गलत है (जो सिर्फ एक बार रहता था और अगले संस्करण में छोड़ दिया गया था)। और यह शुरू से ही स्पष्ट था। क्या यह अब आपके लिए स्पष्ट है? पहले सोचो, सब कुछ स्वीकार मत करो 'के रूप में' क्या msft तुम्हें बेचने की कोशिश करता है? पी
abatishchev

क्षमा करें, लेकिन मैंने कभी नहीं कहा कि एक ग्राहक को कभी भी URL का निर्माण / उपयोग नहीं करना पड़ता है। जब तक .NET 4.0 उपयोग में है, तब तक उपयोगकर्ता को इसकी परवाह करनी चाहिए। इसे छोटा करने के लिए: डेवलपर्स को क्लाइंट से HttpServerUtility जोड़ने से पहले दो बार सोचना चाहिए। अन्य / बेहतर तरीके हैं, बस 139 वोटों के साथ उत्तर देखें या ".NET फ्रेमवर्क 4.5 के बाद से आप WebUtility.UrlEncode का उपयोग कर सकते हैं। सबसे पहले, यह System.dll में रहता है, इसलिए इसे किसी भी अतिरिक्त संदर्भ की आवश्यकता नहीं है।"
hfrmobile

9

.NET कार्यान्वयन UrlEncodeRFC 3986 का अनुपालन नहीं करता है।

  1. कुछ वर्ण एन्कोडेड नहीं हैं, लेकिन होने चाहिए। !()*वर्ण एक आरक्षित अक्षर हैं जो एन्कोड किया जाना चाहिए अभी तक नेट इन पात्रों सांकेतिक शब्दों में बदलना करने में विफल रहता के रूप में आरएफसी खंड 2.2 में सूचीबद्ध हैं।

  2. कुछ पात्र एन्कोडेड हैं, लेकिन नहीं होने चाहिए। .-_पात्रों आरक्षित वर्ण है कि अभी तक नेट ग़लती से इनकोडिंग नहीं किया जाना चाहिए इन पात्रों को कूटबद्ध रूप में आरएफसी खंड 2.2 में सूचीबद्ध नहीं हैं।

  3. RFC निर्दिष्ट करता है कि सुसंगत होने के लिए, कार्यान्वयन को ऊपरी-केस HEXDIG का उपयोग करना चाहिए, जहां .NET लोअर-केस HEXDIG का उत्पादन करता है।


4

मुझे लगता है कि यहां के लोग UrlEncode संदेश से अलग हो गए। URLEncoding नहीं है जो आप चाहते हैं - आप ऐसे सामान को एन्कोड करना चाहते हैं जो लक्ष्य प्रणाली पर फ़ाइल नाम के रूप में काम नहीं करेगा।

यह मानते हुए कि आप कुछ सामान्यता चाहते हैं - कई प्रणालियों (मैकओएस, विंडोज, लिनक्स और यूनिक्स) पर अवैध पात्रों को खोजने के लिए स्वतंत्र महसूस करते हैं, बचने के लिए वर्णों का एक समूह बनाने के लिए उन्हें संघ बनाते हैं।

भागने के लिए, हेक्सएस्केप ठीक होना चाहिए (% XX के साथ वर्णों को प्रतिस्थापित करना)। प्रत्येक वर्ण को UTF-8 बाइट्स में कनवर्ट करें और यदि आप यूनिकोड न करने वाली प्रणालियों का समर्थन करना चाहते हैं तो सब कुछ> 128 को एनकोड करें। लेकिन अन्य तरीके भी हैं, जैसे कि बैक स्लैश "\" या HTML एन्कोडिंग "" का उपयोग करना। "आप अपना खुद का बना सकते हैं। किसी भी सिस्टम को करना है जो असंगत चरित्र को 'एनकोड' करता है। उपरोक्त सिस्टम आपको फिर से बनाने की अनुमति देता है। मूल नाम - लेकिन रिक्त स्थान के साथ खराब वर्णों को बदलने की तरह कुछ भी काम करता है।

ऊपर के समान स्पर्शरेखा पर, उपयोग करने वाला एकमात्र है

Uri.EscapeDataString

- यह OAuth के लिए आवश्यक हर चीज को एनकोड करता है। यह उन चीजों को एनकोड नहीं करता है जो OAuth को एन्कोडिंग से रोकती हैं, और स्पेस को% 20 के रूप में मना करती हैं और + (OATH स्पेक में भी) देखें: RFC 3986. AFBIK, यह है नवीनतम URI कल्पना।


3

मैंने एक C # विधि लिखी है जो सभी प्रतीकों को url- एन्कोड करती है:

    /// <summary>
    /// !#$345Hf} → %21%23%24%33%34%35%48%66%7D
    /// </summary>
    public static string UrlEncodeExtended( string value )
    {
        char[] chars = value.ToCharArray();
        StringBuilder encodedValue = new StringBuilder();
        foreach (char c in chars)
        {
            encodedValue.Append( "%" + ( (int)c ).ToString( "X2" ) );
        }
        return encodedValue.ToString();
    }

1

आदर्श रूप में ये "FileNaming" नामक एक वर्ग में जाएंगे या शायद "FileNameEncode" के लिए एनकोड का नाम बदल सकते हैं। नोट: ये पूर्ण पथ, बस फ़ोल्डर और / या फ़ाइल नाम को संभालने के लिए डिज़ाइन नहीं किए गए हैं। आदर्श रूप से आप पहले अपना पूरा पथ विभाजित करेंगे ("/") और फिर टुकड़ों की जांच करेंगे। और जाहिर है, एक संघ के बजाय, आप बस "%" वर्ण को Windows में अनुमति नहीं दी गई वर्णों की सूची में जोड़ सकते हैं, लेकिन मुझे लगता है कि यह इस तरह से अधिक उपयोगी / पठनीय / तथ्यात्मक है। Decode () बिल्कुल वैसा ही है, लेकिन बदलें (Uri.HexEscape (s [0]), s) "अक्षर से बच गए"।

public static List<string> urlEncodedCharacters = new List<string>
{
  "/", "\\", "<", ">", ":", "\"", "|", "?", "%" //and others, but not *
};
//Since this is a superset of urlEncodedCharacters, we won't be able to only use UrlEncode() - instead we'll use HexEncode
public static List<string> specialCharactersNotAllowedInWindows = new List<string>
{
  "/", "\\", "<", ">", ":", "\"", "|", "?", "*" //windows dissallowed character set
};

    public static string Encode(string fileName)
    {
        //CheckForFullPath(fileName); // optional: make sure it's not a path?
        List<string> charactersToChange = new List<string>(specialCharactersNotAllowedInWindows);
        charactersToChange.AddRange(urlEncodedCharacters.
            Where(x => !urlEncodedCharacters.Union(specialCharactersNotAllowedInWindows).Contains(x)));   // add any non duplicates (%)

        charactersToChange.ForEach(s => fileName = fileName.Replace(s, Uri.HexEscape(s[0])));   // "?" => "%3f"

        return fileName;
    }

धन्यवाद @ simon-tewsi ऊपर बहुत उपयोगी तालिका के लिए!


उपयोगी भी: Path.GetInvalidFileNameChars()
m1m1k 22

हाँ। इसे करने का एक तरीका यह है: foreach (char c in System.IO.Path.GetInvalidFileNameChars ()) {फ़ाइल नाम = फ़ाइल नाम। (C, '_'); }
नेटफेड

0

@ डैन हर्बर्ट के जवाब के अलावा, आपको हमें आम तौर पर बस मूल्यों को एनकोड करना चाहिए।

स्प्लिट के पास पैरामीटर पैरामीटर स्प्लिट ('&', '=') है; अभिव्यक्ति पहले और फिर '=' से विभाजित होती है, इसलिए विषम तत्व नीचे दिखाए गए एन्कोड किए गए सभी मान हैं।

public static void EncodeQueryString(ref string queryString)
{
    var array=queryString.Split('&','=');
    for (int i = 0; i < array.Length; i++) {
        string part=array[i];
        if(i%2==1)
        {               
            part=System.Web.HttpUtility.UrlEncode(array[i]);
            queryString=queryString.Replace(array[i],part);
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.