280

VB 포럼 소프트웨어에 POST 요청을 보내고 쿠키를 설정하지 않고 누군가를 기록하는 응용 프로그램이 있습니다.

사용자가 로그인하면 로컬 컴퓨터에 경로를 만드는 변수를 만듭니다.

c : \ tempfolder \ date \ 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 값 또는 문자를 쉽게 식별 할 수있는 다른 값입니다.


12 답변


164

편집 :이 답변은 지금 구식입니다. 만나다아래 Siarhei Kuchuk의 대답더 나은 수정을 위해

UrlEncoding은 여기서 제안한 것을 할 것입니다. C #을 사용하면HttpUtility, 말한 바와 같이.

또한 잘못된 문자를 정규식으로 대체 한 다음 바꿀 수도 있지만 올바른 문자로 바꿀 수있는 상태 머신 (스위치 ... 대소 문자 등)을 사용해야하므로 훨씬 복잡해집니다. 이후UrlEncode이 일을 앞당긴다. 그것은 쉽다.

리눅스 대 윈도우에 관해서는, 리눅스에 수용 가능한 몇몇 문자가 있습니다. 윈도우에서는 그렇지 않습니다 만, URL 스트링의 디코드에 의해 폴더 이름이 반환 될 수 있기 때문에 걱정하지 않을 것입니다.UrlDecode따라서 변경 사항을 라운드 트립 할 수 있습니다.


  • 이것은 실제로 다음을 인코딩합니다. // http : //에서 // - CantGetANick
  • 웹 API에서 +로 작동하지 않는 것 같습니다. - Toolkit
  • 이 답변은 구식입니다. 아래의 몇 가지 대답을 읽으십시오 - .net45에서 이것은 올바른 해결책 일 수 있습니다 :msdn.microsoft.com/en-us/library/… - blueberryfields
  • FTP의 경우 각 Uri 파트 (폴더 또는 파일 이름)는 Uri.EscapeDataString (fileOrFolderName)을 사용하여 Uri 호환되지 않는 모든 문자 (공백, 유니 코드 ...)를 허용하도록 구성 할 수 있습니다. 예를 들어 filename에 임의의 문자를 허용하려면 다음을 사용합니다. req = (FtpWebRequest) WebRequest.Create (new Uri (path + "/"&Uri.EscapeDataString (filename))); HttpUtility.UrlEncode ()를 사용하면 공백을 더하기 기호 (+)로 바꿉니다. 검색 엔진에 대한 올바른 동작이지만 파일 / 폴더 이름에 대해서는 올바르지 않습니다. - Renaud Bancel
  • 혹시 js 스크립트를 추가하려고하면 경고 메시지가 나타나는 asp.net은 URL에서 xss의 대다수를 차단합니다.A potentially dangerous Request.Path value was detected from the client. - Learning

432

.NET에서 URL 인코딩을 제공하는 다양한 방법을 실험 해 왔습니다. 아마도 다음 표가 유용 할 것입니다 (필자가 작성한 테스트 응용 프로그램의 출력 결과).

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 자만 처리 할 수 있습니다. 따라서 그것은ArgumentOutOfRangeLatin A-Extended 문자 (예 : Â)는 예외입니다.

  2. 이 테이블은 .NET 4.0에서 생성되었습니다 (아래의 Levi Botelho의 주석에서 .NET 4.5의 인코딩은 약간 다릅니다).

편집하다:

NET 4.5 용 인코딩이있는 두 번째 테이블을 추가했습니다. 이 답변보기 :https://stackoverflow.com/a/21771206/216440

편집 2 :

사람들은이 테이블을 인식하는 것처럼 보이기 때문에 테이블을 생성하는 소스 코드가 마음에 드실 것 같아서 스스로 놀 수 있습니다. .NET 4.0 또는 4.5를 대상으로 할 수있는 간단한 C #콘솔 응용 프로그램입니다.

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


  • 이 유용한 요약을 보내 주셔서 감사합니다. 제 의견으로는 이것은 MSDN 문서의 일부분이어야합니다 ;-) - hfrmobile
  • 이것은 환상적인 대답입니다. 내가 Uri.EscapeDataString을 사용하고 System.Web을 포함하지 않기를 바랬습니다. 이 테이블을 가져 주셔서 감사합니다. - Seravy
  • 더 이상 100 % 정확하지 않습니다. 특정 기능은 .NET 4와 .NET 4.5 사이에서 약간 변경되었습니다. 만나다stackoverflow.com/q/20003106/1068266. - Levi Botelho
  • @ 리비 : 머리를 주셔서 감사합니다. .NET 4.5 표에 대한 두 번째 답변을 추가했습니다. 두 번째 표와 연결되는 원래 답변을 수정했습니다. - Simon Tewsi
  • 언급 한 것을 잊어 버렸습니다. 위의 제 의견은UrlPathEncode. 따라서 기본적으로UrlPathEncodeUri.EscapeUriString. - Andrew

258

유효하지 않을 수있는 사용자 이름 또는 URL의 다른 부분 만 인코딩해야합니다. 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");

잘하면 도움이됩니다. 또한,teedyay언급했듯이 불법적 인 파일 이름 문자가 제거되었는지 확인해야합니다. 그렇지 않으면 파일 시스템이 경로를 좋아하지 않습니다.


  • HttpUtility.UrlPathEncode 메소드를 사용하면 여기에서 설명하는 문제를 방지 할 수 있습니다. - vipirtti
  • @DJ Pirtu : UrlPathEncode가 경로에서 이러한 바람직하지 않은 변경을하지는 못했지만 그 이후에는 아무 것도 인코딩하지 못했습니다.?(쿼리 문자열이 이미 인코딩되었다고 가정하기 때문에). Dan Herbert의 사례에서 그는 허구처럼 보입니다.Example인코딩이 필요한 텍스트이므로HttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");작동하지 않습니다. 사용해보기?q=Ex&ple(원하는 결과가?q=Ex%26ple). (1) UrlPathEncode는 이후에 아무 것도 터치하지 않기 때문에 작동하지 않습니다.?, (2) UrlPathEncode가 인코딩하지 않습니다.&어쨌든. - Tim Goodman
  • 여길 봐:connect.microsoft.com/VisualStudio/feedback/details/551839/…UrlPathEncode가 인코딩하지 않았다는 사실을 물론 추가해야합니다.&왜냐하면 쿼리 문자열 매개 변수를 구분해야하기 때문입니다. 그러나 인코딩 된 앰퍼샌드도 필요할 때가 있습니다. - Tim Goodman
  • HttpUtility는 WebUtility에서 최신 버전으로 승계되었으며, 시간을 아낄 수 있습니다. :) - Wiseman

150

더 나은 방법은 사용하는 것입니다.

Uri.EscapeUriString

.net의 전체 프로필을 참조하지 않기 4.


  • 일반적으로 "고객 프로필" System.Net을 사용하지만 System.Web을 사용하지 않는 앱은 충분합니다. ;-) - hfrmobile
  • OP는 파일 시스템과의 호환성을 검사 중이므로 작동하지 않습니다. Windows에서 허용하지 않는 문자 세트는 ' [ "/", "\\", "<", ">": ":"\ "" , "|", "?", "*"] < 하지만 이들 중 대다수는 EscapedUriString을 사용하여 인코딩되지 않습니다 (아래 표 참조). @Simon Tewsi라는 테이블에 대해 감사합니다. "" 로컬 시스템에 경로를 생성합니다 " -OP UrlEncoded는 거의 모든 문제를 처리하지만 "%"를 사용하여 문제를 해결하지 못합니다. 또는 "% 3f" 원래의 입력에서, "디코드" 이제 원본과 다를 것입니다. - m1m1k
  • 파일 시스템에 대한이 대답은 WONT WORK입니다. - m1m1k
  • 또한 .NET Framework 4.5부터는 Client Profile이 중단되었으며 전체 재배포 가능 패키지 만 사용할 수 있습니다. - twomm
  • stackoverflow.com/a/34189188/3436164용도Uri.EscapeDataString아니Uri.EscapeUriString이 주석을 읽으면서 나를 도왔습니다. - ykadaru

149

이후.NET Framework 4.5당신이 사용할 수있는WebUtility.UrlEncode.

첫째, 그것은~에 거주하다System.dll따라서 추가 참조가 필요하지 않습니다.

둘째,URL의 문자를 올바르게 이스케이프 처리합니다.달리Uri.EscapeUriString(drweb86의 답변에 대한 의견 참조).

셋째, 그것은문자열의 길이에 제한이 없다.달리Uri.EscapeDataString(만나다관련 질문), 예를 들어 POST 요청에 사용될 수 있습니다.

넷째,WinRT에서 사용 가능달리HttpUtility(만나다관련 질문).


  • 멋진 점에 대해 감사드립니다 - 당신은 어떤 어셈블리가 상주하고 어떤 플랫폼을 사용할 수 있는지 알고 싶을 것입니다. 감사합니다! - Jimmy Hoffa
  • 나는 "+"코드를 사용하여 인코딩하는 방식을 좋아합니다. 공백을 % 20 대신에. 그러나 이것은 여전히 " URL에서 알 수 없거나 잘못된 URL을 제공합니다. 오 .. 글쎄. 그냥 대체 (" " " " " ")해야합니다. - ppumkin

64

Levi Botelho는 이전에 생성 된 인코딩 테이블이. NET 4.0과 4.5 사이의 인코딩이 약간 변경 되었기 때문에 .NET 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 자만 처리 할 수 있습니다. 따라서 Latin A-Extended 문자 (예 : Â)에 대해서는 ArgumentOutOfRange 예외가 발생합니다.

  2. 이 테이블은 .NET 4.5에서 생성되었습니다 (응답 참조).https://stackoverflow.com/a/11236038/216440.NET 4.0 이하와 관련된 인코딩의 경우).

편집하다:

  1. Discord의 대답으로 .NET 4.5에서 소개 된 새로운 WebUtility UrlEncode 및 HtmlEncode 메서드를 추가했습니다.


  • 아니 사용자 UrlPathEncode - 심지어 MSDN은 그것이 사용되지 않습니다 말합니다. netscape 2로 문제를 해결하기위한 빌드였습니다.msdn.microsoft.com/en-us/library/… - Jeff
  • Server.URLEncode가이 테마의 또 다른 변형입니까? 다른 출력을 생성합니까? - ALEXintlsos
  • @ALEX : ASP.NET에서 Server 개체는 HttpServerUtility의 인스턴스입니다. dotPeek 디 컴파일러를 사용하여 HttpServerUtility.UrlEncode를 살펴 보았습니다. 두 메서드의 출력이 동일하도록 HttpUtility.UrlEncode를 호출합니다. - Simon Tewsi
  • 이처럼 인코딩 방법이 너무 많아도, → 또는 such과 같이 라틴어 1 위의 모든 부분에서 여전히 훌륭하게 실패합니다. (UrlEncodedUnicode는 최소한 유니 코드를 지원하려고 시도하지만 더 이상 사용되지 않거나 누락 된 것 같습니다.) - brianary
  • Simon,이 대답을 수락 된 대답에 통합 할 수 있습니까? 한 가지 대답으로 생각하면 좋을 것입니다. 당신은 그것을 통합하고 그 대답의 맨 아래에 h1 헤딩을 만들거나 하나의 테이블에 통합하고 다음과 같이 다른 라인을 표시 할 수 있습니다 :(Net4.0) ? %3f................................ (Net4.5) ? %3f .................................. - T.Todua

52

URL 인코딩은 .NET에서 쉽습니다. 용도:

System.Web.HttpUtility.UrlEncode(string url)

폴더 이름을 가져 오기 위해 디코딩 될 경우 폴더 이름 (*,?, / 등)에서 사용할 수없는 문자는 제외해야합니다.


  • 그것은 알파벳의 일부가 아닌 모든 문자를 인코딩합니까? - masfenix
  • URL 인코딩은 URL에서 허용되지 않는 문자를 문자 엔티티로 변환합니다. 안전하지 않은 문자 목록 :blooberry.com/indexdot/html/topics/urlencoding.htm - Ian Robinson
  • HttpUtility.UrlEncode의 MSDN 링크 :msdn.microsoft.com/en-us/library/4fkewx0t.aspx - Ian Robinson
  • 답을 전체 System.Web ... 부분에 입력하는 것이 좋습니다. 많은 사람들이 시간을 절약 할 수 있습니다. 감사합니다. - Liam
  • 이것은 위험합니다. URL의 모든 문자를 인코딩 할 필요는 없으며 쿼리 문자열의 매개 변수 값만 인코딩해야합니다. 제안하는 방법은 & 이는 쿼리 문자열에 여러 매개 변수를 만드는 데 필요합니다. 필요한 경우 필요한 경우 매개 변수의 각 값을 인코딩하는 것입니다. - Marco Staffoli

12

System.Web을 볼 수 없으면 프로젝트 설정을 변경하십시오. 대상 프레임 워크는 ".NET Framework 4 Client Profile"대신 ".NET Framework 4"여야합니다.


  • 제 생각에는 개발자는 " .NET 프로필 " 그리고 그들은옳은하나는 그들의 목적을 위해! 전체 프로필을 추가하는 이유를 실제로 모르는 채로 전체 프로필을 추가하기 만하면 (예 : System.Web) 매우 똑똑하지는 않습니다. " 클라이언트 프로필 " 당신을 위해고객앱 및 전체 프로필필요할 때만(예 : WinForms 또는 WPF 클라이언트는 전체 프로필이 아닌 클라이언트 프로필을 사용해야합니다)! 예 : 클라이언트 앱에서 HttpServerUtility를 사용하는 이유를 모르겠습니다 ^^ ... 필요한 경우 앱의 디자인에 문제가 있습니다. - hfrmobile
  • 정말? 클라이언트 앱이 URL을 생성해야하는 필요성을 느끼지 못합니까? 당신은 생활 수장 직무로 무엇을합니까? - sproketboy
  • @hfrmobile : 아니오. 프로필 모델 (한 번만 살았고 다음 버전에서 버려진 프로필 모델)은 모두 잘못되었습니다. 그리고 그것은 처음부터 분명했습니다. 지금 당신에게 명백한가요? 먼저 모든 것을 수락하지 말고 ' msft가 너를 팔려고하는 것; P - abatishchev
  • 죄송하지만 클라이언트가 URL을 작성 / 사용하지 않아도된다는 말은하지 않았습니다. NET 4.0이 사용되는 한 사용자는주의해야합니다. 간단히 말하자면 개발자는 HttpServerUtility를 클라이언트에 추가하기 전에 두 번 생각해야합니다. 다른 / 더 좋은 방법이 있습니다. 투표 수 139 회 또는 " .NET Framework 4.5 이후 WebUtility.UrlEncode를 사용할 수 있습니다. 첫째, 그것은 System.dll에 있기 때문에 추가 참조가 필요하지 않습니다. " - hfrmobile

9

.NET 구현UrlEncodeRFC 3986을 준수하지 않습니다.

  1. 일부 문자는 인코딩되지 않지만 반드시 있어야합니다. 그만큼!()*문자는 RFC의 섹션 2.2에 나열되어 있지만 아직 인코딩해야하는 예약 문자로 .NET에서는 이러한 문자를 인코딩하지 못합니다.

  2. 일부 문자는 인코딩 되나 없어야합니다. 그만큼.-_문자는 RFC의 섹션 2.2에서 인코딩되지 않아야하는 예약 문자로 나열되지 않습니다. .NET은 이러한 문자를 잘못 인코딩합니다.

  3. RFC는 일관성을 유지하기 위해 .NET에서 소문자 HEXDIG를 생성하는 대문자 HEXDIG를 사용해야한다고 명시합니다.


1

이상적으로 이것들은 "FileNaming"이라 불리는 클래스에 있거나 단순히 Encode의 이름을 "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
  • 예. 한 가지 방법은 다음과 같습니다. foreach (System.IO.Path.GetInvalidFileNameChars ()의 char c) {filename = filename.Replace (c, & _ '); } - netfed

1

모든 기호를 url-encodes C #메서드를 작성했습니다.

    /// <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();
    }


0

@Dan Herbert의 답변 외에도, 우리는 값들을 일반적으로 부호화해야합니다.

스플릿에는 params 매개 변수가 있습니다. Split ( '&', '='); 첫 번째로 & '='이렇게 이상한 요소는 아래에 표시된 모든 값이 인코딩됩니다.

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

연결된 질문


관련된 질문

최근 질문