C # kullanarak URL Kodlama


340

VB forum yazılımına bir POST isteği gönderir ve (çerezleri ya da herhangi bir şey ayarlamadan) birisi oturum açar bir uygulama var.

Kullanıcı oturum açtıktan sonra yerel makinelerinde yol oluşturan bir değişken oluşturuyorum.

c: \ TempFolder \ tarih \ kullanıcı adı

Sorun, bazı kullanıcı adlarının "Yasadışı karakter" istisnası atmasıdır. Örneğin, kullanıcı adım mas|fenixolsaydı bir istisna atardı.

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

Dizeden kaldırmak istemiyorum, ancak sunucudaki FTP aracılığıyla kullanıcı adlarıyla bir klasör oluşturulur. Bu da ikinci sorum olacak. Sunucuda bir klasör oluşturuyorsam "yasadışı karakterleri" bırakabilir miyim? Bunu sadece sunucu Linux tabanlı olduğu için soruyorum ve Linux'un kabul edip etmediğinden emin değilim.

EDIT: Görünüşe göre URL kodlaması istediğim değil .. İşte yapmak istediğim:

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

% Xx, ASCII değeri veya karakteri kolayca tanımlayacak başka bir değerdir.


Dosya sistemi güvenli klasör adlarını yapmak için bunu
ekleyin

Yanıtlar:


191

Düzenle: Bu yanıtın artık güncel olmadığını unutmayın. Daha iyi bir düzeltme için Siarhei Kuchuk'un cevabına bakınız .

UrlEncoding burada önerdiklerinizi yapacak. C # ile, HttpUtilitybelirtildiği gibi kullanmanız yeterlidir .

Ayrıca yasadışı karakterleri Regex yapabilir ve daha sonra değiştirebilirsiniz, ancak doğru karakterlerle değiştirmek için bir tür durum makinesine (örneğin, anahtar ... durum) sahip olmanız gerekeceğinden, bu çok daha karmaşık hale gelir. Yana UrlEncodebu ön yapar oldukça kolaydır.

Linux ve pencerelere gelince, Linux'ta kabul edilebilir bazı karakterler vardır, ancak Windows'da olmayan, ancak endişelenmeyeceğim, çünkü klasör adı Url dizesini çözerek geri döndürülebilir UrlDecode, böylece değiştirir.


5
bu cevap şimdi güncel değil. aşağıdaki birkaç cevabı okuyun - .net45'ten itibaren bu doğru çözüm olabilir: msdn.microsoft.com/en-us/library/…
blueberryfields

1
FTP için her Uri kısmı (klasör veya dosya adı) Uri uyumlu olmayan tüm karakterlere (boşluklar, unicode ...) izin veren Uri.EscapeDataString (fileOrFolderName) kullanılarak oluşturulabilir. Örneğin, dosya adındaki herhangi bir karaktere izin vermek için şunu kullanın: req = (FtpWebRequest) WebRequest.Create (yeni Uri (yol + "/" + Uri.EscapeDataString (dosyaadı))); HttpUtility.UrlEncode () yöntemini kullanarak boşlukları artı işaretleriyle (+) değiştirin. Arama motorları için doğru davranış, ancak dosya / klasör adları için yanlış davranış.
Renaud Bancel

js script eklemeye çalıştığınızda uyarı alırken asp.net url'deki xss çoğunluğunu engeller A potentially dangerous Request.Path value was detected from the client.
Öğrenme

511

Ben URL kodlama için sağladıkları çeşitli yöntemler deniyorum. Belki de aşağıdaki tablo yararlı olacaktır (yazdığım bir test uygulamasından çıktı olarak):

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]

Sütunlar aşağıdaki gibi kodlamaları temsil eder:

  • urlencoded: HttpUtility.UrlEncode

  • UrlEncodedUnicode: HttpUtility.UrlEncodeUnicode

  • UrlPathEncoded: HttpUtility.UrlPathEncode

  • EscapedDataString: Uri.EscapeDataString

  • EscapedUriString: Uri.EscapeUriString

  • HTMLEncoded: HttpUtility.HtmlEncode

  • HtmlAttributeEncoded: HttpUtility.HtmlAttributeEncode

  • HexEscaped: Uri.HexEscape

NOTLAR:

  1. HexEscapeyalnızca ilk 255 karakteri işleyebilir. Bu nedenle ArgumentOutOfRangeLatin A Genişletilmiş karakterleri için bir istisna atar (örn. Ā).

  2. Bu tablo .NET 4.0'da oluşturulmuştur (bkz. Levi Botelho'nun .NET 4.5'teki kodlamanın biraz farklı olduğunu söyleyen yorumu).

DÜZENLE:

.NET 4.5 kodlamaları ile ikinci bir tablo ekledim. Bu yanıta bakın: https://stackoverflow.com/a/21771206/216440

DÜZENLEME 2:

İnsanlar bu tabloları takdir ettikleri için, tabloyu oluşturan kaynak kodunu beğenebileceğinizi düşündüm, böylece kendi etrafınızda oynayabilirsiniz. .NET 4.0 veya 4.5'i hedefleyebilen basit bir C # konsol uygulamasıdır:

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
Bu harika bir cevap. Uri.EscapeDataString kullanmak istedim ve System.Web içermiyor çıkıyor. Bu tablo için teşekkürler.
Seravy

7
Bunun artık% 100 doğru olmadığını unutmayın. Bazı işlevler .NET 4 ve .NET 4.5 arasında biraz değişmiştir. Bkz. Stackoverflow.com/q/20003106/1068266 .
Levi Botelho

2
@Levi: Uyarı için teşekkürler. .NET 4.5 tablo ile ikinci bir cevap ekledim. İkinci tabloya bağlantı oluşturmak için orijinal cevabı düzenledim.
Simon Tewsi

.NET belgelerinde Kullanmayın; yalnızca tarayıcı uyumluluğu için tasarlanmıştır. UrlEncode kullanın. , ancak bu yöntem pek çok istenmeyen karakteri kodlar. En yakın olanı Uri.EscapeUriString, ancak bir nullargümanı desteklemediğine dikkat edin .
Andrew

1
Bahsetmeyi unuttum, yukarıdaki yorumum için UrlPathEncode. Yani temelde değiştirmek UrlPathEncodeile Uri.EscapeUriString.
Andrew

279

URL'nin yalnızca kullanıcı adını veya URL'nin geçersiz olabilecek başka bir bölümünü kodlamanız gerekir. Bir URL'yi kodlayan URL, aşağıdaki gibi bir şeyden dolayı sorunlara yol açabilir:

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

Verim olacak

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

Bu kesinlikle işe yaramayacak. Bunun yerine, SADECE sorgu dizesindeki anahtar / değer çiftinin değerini şu şekilde kodlamanız gerekir:

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

Umarım bu yardımcı olur. Ayrıca, teedyay'ın belirttiği gibi, yine de yasadışı dosya adı karakterlerinin kaldırıldığından emin olmanız gerekir, aksi takdirde dosya sistemi yolu sevmez.


34
HttpUtility.UrlPathEncode yöntemini kullanmak, burada açıkladığınız sorunu önlemelidir.
vipirtti

12
@DJ Pirtu: UrlPathEncode'un yolda bu istenmeyen değişiklikleri yapmayacağı, ancak ?(sorgu dizesinin zaten kodlanmış olduğu varsayıldığı için) sonrasında da hiçbir şey kodlamayacağı doğrudur . Dan Herbert örneğinde Example, kodlama gerektiren metin gibi davranıyor gibi görünüyor , bu yüzden HttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");işe yaramayacak. Deneyin ?q=Ex&ple(istenen sonucun olduğu yerde ?q=Ex%26ple). (1) UrlPathEncode daha sonra hiçbir şeye dokunmaz ?ve (2) UrlPathEncode &yine de kodlamaz .
Tim Goodman

1
Buraya bakın: connect.microsoft.com/VisualStudio/feedback/details/551839/… Tabii ki, UrlPathEncode'un kodlamamasının iyi olduğunu eklemeliyim &, çünkü sorgu dizesi parametrelerinizi sınırlamak zorundasınız. Ancak, kodlanmış ve işaretleri de istediğiniz zamanlar vardır.
Tim Goodman

10
HttpUtility, WebUtility tarafından son sürümlerde başarıldı, biraz zaman kazanın :)
Wiseman

190

Daha iyi bir yol kullanmak

Uri.EscapeUriString

.net 4'ün Tam Profiline başvurmamak.


1
System.Net kullanan ancak System.Web ;-) kullanılmayan uygulamalar için "İstemci Profili" genellikle sık olduğu için tamamen katılıyorum
hfrmobile

6
OP, dosya sistemi uyumluluğu için kontrol etmekten bahsediyor, bu yüzden işe yaramayacak. Windows izin verilmeyen karakter kümesi '["/", "\\", "<", ">", ":", "\" "," | ","? "," * "]' Dir ancak bunların çoğu EscapedUriString kullanarak kodlanmayın (aşağıdaki tabloya bakın - bu tablo @Simon Tewsi için teşekkürler) ... "yerel makinelerinde bir yol oluşturur" -OP UrlEncoded neredeyse tüm sorunları halleder, ancak çözmez "%" veya "% 3f" orijinal girdide
bulunma sorunu

6
sadece açıklığa kavuşturmak için: BU yanıt dosya sistemleri için
ÇALIŞMAZ

1
Ayrıca, .NET Framework 4.5'ten başlayarak, İstemci Profili durduruldu ve yalnızca tam yeniden dağıtılabilir paketi kullanılabilir.
twomm

29
stackoverflow.com/a/34189188/3436164 Kullan Uri.EscapeDataStringDEĞİL Uri.EscapeUriStringBu yorumu okuyun, bana yardımcı oldu.
ykadaru

181

.NET Framework 4.5 ve .NET Standard 1.0'dan beri kullanmalısınız WebUtility.UrlEncode. Alternatiflere göre avantajları:

  1. .NET Framework 4.5+, .NET Core 1.0+, .NET Standard 1.0+, UWP 10.0+ ve tüm Xamarin platformlarının bir parçasıdır. HttpUtility, daha önce .NET Framework'te (.NET Framework 1.1+) kullanılabilir olmasına rağmen, daha sonra diğer platformlarda (.NET Core 2.0+, .NET Standard 2.0+) kullanılabilir hale gelir ve UWP'de hala mevcut değildir ( ilgili soruya bakın ).

  2. .NET Framework'te bulunurSystem.dll , bu nedenle aksine başka başvuru gerektirmez HttpUtility.

  3. Bunun aksine URL'ler için karakterlerden düzgün bir şekilde kaçarUri.EscapeUriString ( drweb86'nın cevabına yapılan yorumlara bakın ).

  4. Bunun aksine , ipin uzunluğu konusunda herhangi bir sınırı yokturUri.EscapeDataString (bkz. ilgili soru ) örneğin, POST istekleri için kullanılabilecek şekilde.


Ben boşluklar için% 20 yerine "+" kullanarak kodlama şeklini seviyorum .. ama bu hala "URL'den kaldırmaz ve bana geçersiz URL verir ... oh iyi .. sadece aa yerine (" "" "", "")
Piotr Kula

85

Levi Botelho, kodlamalar .NET 4.0 ve 4.5 arasında biraz değiştiğinden, daha önce oluşturulan kodlama tablosunun .NET 4.5 için artık doğru olmadığını söyledi. Bu yüzden .NET 4.5 için tabloyu yeniden oluşturdum:

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]

Sütunlar aşağıdaki gibi kodlamaları temsil eder:

  • 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

NOTLAR:

  1. HexEscape yalnızca ilk 255 karakteri işleyebilir. Bu nedenle, Latin A Genişletilmiş karakterleri için bir ArgumentOutOfRange istisnası atar (örn. Ā).

  2. Bu tablo .NET 4.5'te oluşturulmuştur ( .NET 4.0 ve önceki sürümlerle ilgili kodlamalar için bkz. Https://stackoverflow.com/a/11236038/216440 ).

DÜZENLE:

  1. Discord'un cevabının bir sonucu olarak .NET 4.5'te tanıtılan yeni WebUtility UrlEncode ve HtmlEncode yöntemlerini ekledim.

2
Kullanıcı UrlPathEncode değil - MSDN bile kullanılmayacağını söylüyor. Netscape 2 ile ilgili bir sorunu gidermek için oluşturuldu msdn.microsoft.com/en-us/library/…
Jeff

Server.URLEncode bu temadaki başka bir varyasyon mu? Farklı çıktı üretir mi?
ALEXintlsos

2
@ALEX: ASP.NET'te Server nesnesi bir HttpServerUtility örneğidir. DotPeek decompiler kullanarak HttpServerUtility.UrlEncode bir göz vardı. Sadece HttpUtility.UrlEncode'u çağırır, böylece iki yöntemin çıktısı aynı olur.
Simon Tewsi

Görünüşe göre, kodlama yöntemlerinin bu kadar bolluğu ile bile, hepsi hala → veya above gibi Latin-1'in üzerindeki her şey için oldukça muhteşem bir şekilde başarısız oluyor. (UrlEncodedUnicode, en azından Unicode'u desteklemeye çalışıyor gibi görünüyor, ancak kullanımdan kaldırıldı / eksik.)
brianary

Simon, bu cevabı kabul edilen cevaba entegre edebilir misin? tek cevapta olması güzel olacak. bunu entegre edebilir ve bu cevabın altına bir h1 başlığı yapabilir veya bir tabloya entegre edebilirsiniz ve farklı satırları işaretleyebilirsiniz: (Net4.0) ? %3f................................ (Net4.5) ? %3f ..................................
T.Todua

60

Url Kodlaması .NET'te kolaydır. kullanın:

System.Web.HttpUtility.UrlEncode(string url)

Klasör adını almak için kodu çözülecekse, klasör adlarında (*,?, /, Vb.) Kullanılamayan karakterleri hariç tutmanız gerekir.


Alfabenin bir parçası olmayan her karakteri kodlar mı?
masfenix

1
URL kodlaması, bir URL'de izin verilmeyen karakterleri karakter-varlık eşdeğerlerine dönüştürür. Güvensiz karakterlerin listesi: blooberry.com/indexdot/html/topics/urlencoding.htm
Ian Robinson

HttpUtility.UrlEncode üzerinde MSDN Bağlantısı: msdn.microsoft.com/en-us/library/4fkewx0t.aspx
Ian Robinson

11
Tam System.Web ... kısmını cevabınıza koymak iyi bir uygulamadır, çok fazla insanı biraz zaman kazandırır :) teşekkürler
Liam

3
Bu tehlikelidir: url'nin tüm karakterlerinin kodlanması gerekmez, yalnızca querystring parametrelerinin değerleri. Önerdiğiniz yol, sorgu dizesinde birden çok parametre oluşturmak için gereken & kodlamasını da yapar. Çözüm, gerekirse parametrelerin her bir değerini kodlamaktır
Marco Staffoli

12

System.Web'i göremiyorsanız, proje ayarlarınızı değiştirin. Hedef çerçeve, ".NET Framework 4 İstemci Profili" yerine ".NET Framework 4" olmalıdır


1
Bence geliştiriciler ".NET Profilleri" hakkında bilgi sahibi olmalı ve amaçları için doğru olanı kullanmalıdırlar ! Tam profili neden eklediklerini gerçekten bilmeden (ör. System.Web) tam profili eklemek çok akıllı değildir. İstemci uygulamalarınız için "İstemci Profili" ni ve yalnızca gerektiğinde tam profili kullanın (örneğin, bir WinForms veya WPF istemcisi tam profili değil, istemci profilini kullanmalıdır)! Örneğin bir istemci uygulamasında HttpServerUtility kullanarak bir neden görmüyorum ^ ^ ... bu gerekirse o zaman app tasarımı ile yanlış bir şey var!
hfrmobile

4
Gerçekten mi? Hiç bir istemci uygulaması için URL oluşturma gereği görmüyor musunuz? Yaşayan kapıcılık görevleri için ne yaparsınız?
sproketboy

@hfrmobile: hayır. (Sadece bir kez yaşayan ve bir sonraki versiyonda terk edilen) profil modelinde her şey yanlış. Ve en başından beri belliydi. Sizin için şimdi açık mı? Önce düşünün, her şeyi kabul etmeyin 'olduğu gibi' msft size ne satmaya çalışır; P
abatishchev

Maalesef, bir müşterinin hiçbir zaman URL oluşturmak / kullanmak zorunda olmadığını söylemedim. .NET 4.0 kullanımda olduğu sürece, kullanıcı buna dikkat etmelidir. Kısaca söylemek gerekirse: Geliştiriciler, bir istemciye HttpServerUtility eklemeden önce iki kez düşünmelidir. Başka / daha iyi yollar vardır, sadece 139 oy veya ".NET Framework 4.5 beri WebUtility.UrlEncode kullanabilirsiniz. İlk olarak, System.dll içinde yer almaktadır, bu yüzden herhangi bir ek başvuru gerektirmez.".
hfrmobile

9

.NET uygulaması UrlEncodeRFC 3986 ile uyumlu değildir.

  1. Bazı karakterler kodlanmamıştır ancak olması gerekir. !()*Karakterleri kodlanmış henüz .NET bu karakterleri kodlamak için başarısız olması gerekir ayrılmış karakterler olarak RFC bölüm 2.2'de listelenmiştir.

  2. Bazı karakterler kodlanmıştır ancak olmamalıdır. .-_Karakterleri yanlışlıkla henüz NET kodlanan bu karakterleri kodlar edilmemelidir ayrılmış bir karakter olarak RFC bölüm 2.2'de yer almaz.

  3. RFC, tutarlı olması için uygulamaların .NET'in küçük harf HEXDIG ürettiği büyük harf HEXDIG kullanması gerektiğini belirtir.


4

Sanırım buradaki insanlar UrlEncode mesajıyla uğraştı. URLEncoding değil istediğiniz - hedef sistemde dosya adı olarak çalışmayan şeyleri kodlamak istiyorsunuz.

Biraz genellik istediğinizi varsayarsak - çeşitli sistemlerde (MacOS, Windows, Linux ve Unix) yasadışı karakterleri bulmaktan çekinmeyin, kaçmak için bir dizi karakter oluşturmak için birleştirin.

Kaçış gelince, bir HexEscape iyi olmalı (Karakterleri% XX ile değiştirme). Unicode yapmayan sistemleri desteklemek istiyorsanız, her karakteri UTF-8 bayta dönüştürün ve 128'den büyük her şeyi kodlayın. Ancak ters eğik çizgi "\" veya HTML kodlaması "" "kullanmak gibi başka yollar da vardır. Kendi sisteminizi oluşturabilirsiniz. Tüm yapmanız gereken, uyumsuz karakteri 'kodlamak'tır. orijinal adı - ama kötü karakterleri boşluklarla değiştirmek gibi bir şey de işe yarar.

Yukarıdaki ile aynı teğet üzerinde, kullanılacak tek şey

Uri.EscapeDataString

- OAuth için gereken her şeyi kodlar, OAuth'un kodlamayı yasakladığı şeyleri kodlamaz ve alanı + değil% 20 olarak kodlar (Ayrıca OATH Spesifikasyonunda) Bkz: RFC 3986. AFAIK, bu en son URI spesifikasyonu.


3

Url ALL sembolleri kodlayan bir C # yöntemi yazdım:

    /// <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

İdeal olarak bunlar "FileNaming" adlı bir sınıfa gider veya belki de Encode'u "FileNameEncode" olarak yeniden adlandırır. Not: Bunlar Tam Yolları işlemek için tasarlanmamıştır, sadece klasör ve / veya dosya adlarını içerir. İdeal olarak önce tam yolunuzu Bölün ("/") ve sonra parçaları kontrol edin. Ve açıkça, bir birlik yerine, "%" karakterini Windows'da izin verilmeyen karakter listesine ekleyebilirsin, ama bence bu daha yararlı / okunabilir / olgusal. Decode () tam olarak aynıdır ancak Replace (Uri.HexEscape (s [0]), s) karakterini "kaçmış" olarak değiştirir.

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

Yukarıdaki çok yararlı tablo için @ simon-tewsi teşekkürler!


Ayrıca yararlı: Path.GetInvalidFileNameChars()
m1m1k

Evet. Bunu yapmanın bir yolu: foreach (System.IO.Path.GetInvalidFileNameChars () içindeki char c) {filename = filename.Replace (c, '_'); }
netfed

0

@Dan Herbert'in cevabına ek olarak, genel olarak sadece değerleri kodlamalıyız.

Split parametresinin Split parametresi vardır ('&', '='); ifade önce & sonra '=' ile bölünür, böylece tek elemanlar aşağıda kodlanacak olan tüm değerlerdir.

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);
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.