[C#] C #을 사용한 URL 인코딩

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

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

c : \ tempfolder \ date \ 사용자 이름

문제는 일부 사용자 이름에 “잘못된 문자”예외가 발생한다는 것입니다. 예를 들어 내 사용자 이름 인 경우 mas|fenix예외가 발생합니다.

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

문자열에서 제거하고 싶지 않지만 사용자 이름이있는 폴더는 서버의 FTP를 통해 생성됩니다. 그리고 이것은 두 번째 질문으로 이어집니다. 서버에 폴더를 만드는 경우 “불법 문자”를 그대로 둘 수 있습니까? 서버가 Linux 기반이기 때문에이 질문 만하고 Linux가 서버를 허용하는지 확실하지 않습니다.

편집 : URL 인코딩이 내가 원하는 것이 아닌 것 같습니다. 여기 내가하고 싶은 일이 있습니다.

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

여기서 % xx는 ASCII 값 또는 문자를 쉽게 식별 할 수있는 다른 값입니다.



답변

편집 :이 답변은 이제 오래되었습니다. 아래 Siarhei Kuchuk의 답변을 참조하십시오 더 나은 수정을 위해

UrlEncoding은 여기에서 제안하는 것을 수행합니다. C #에서는 HttpUtility위에서 언급했듯이 간단히을 사용 합니다.

또한 잘못된 문자를 정규식으로 교체 한 다음 바꿀 수 있지만 올바른 문자로 바꾸려면 어떤 형태의 상태 머신 (예 : 스위치 … 대소 문자)이 있어야하므로 훨씬 더 복잡해집니다. 이후UrlEncode이것이 오히려 쉽습니다.

Linux와 Windows의 경우 Windows에서는 Linux에서 허용되지 않는 문자가 있지만을 사용하여 Url 문자열을 디코딩하여 폴더 이름을 반환 할 수 있으므로 걱정하지 않아도됩니다 UrlDecode. 변화.


답변

.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

  • 유니 코드 : HttpUtility.UrlEncodeUnicode

  • UrlPathEncoded : HttpUtility.UrlPathEncode

  • 이스케이프 된 데이터 문자열 : Uri.EscapeDataString

  • EscapedUriString : Uri.EscapeUriString

  • 인코딩 된 : HttpUtility.HtmlEncode

  • 인코딩 된 HtmlAttribute : HttpUtility.HtmlAttributeEncode

  • HexEscaped : Uri.HexEscape

노트:

  1. HexEscape처음 255 자만 처리 할 수 ​​있습니다. 따라서 ArgumentOutOfRange라틴 A- 확장 문자 (예 : Â) 에는 예외 가 발생합니다.

  2. 이 테이블은 .NET 4.0에서 생성되었습니다 (아래 .NET 4.5의 인코딩이 약간 다르다는 Levi Botelho의 의견 참조).

편집하다:

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


답변

유효하지 않은 사용자 이름 또는 URL의 다른 부분 만 인코딩해야합니다. URL을 URL 인코딩하면 다음과 같은 문제가 발생할 수 있습니다.

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

생산량

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

이것은 분명히 잘 작동하지 않을 것입니다. 대신 다음과 같이 쿼리 문자열에서 키 / 값 쌍의 값만 인코딩해야합니다.

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

잘하면 그것은 도움이됩니다. 또한 teedyay가 언급했듯이 불법 파일 이름 문자를 제거하지 않으면 파일 시스템이 경로를 좋아하지 않아야합니다.


답변

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

Uri.EscapeUriString

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


답변

이후 .NET 프레임 워크 4.5.NET 표준 1.0 당신은 사용해야합니다 WebUtility.UrlEncode. 대안에 비해 장점 :

  1. .NET Framework 4.5 이상, .NET Core 1.0 이상, .NET Standard 1.0 이상, UWP 10.0 이상 및 모든 Xamarin 플랫폼의 일부입니다. HttpUtility.NET Framework 이전 버전 (.NET Framework 1.1+)에서 사용 가능하지만 다른 플랫폼 (.NET Core 2.0+, .NET Standard 2.0+)에서 훨씬 나중에 제공되며 UWP에서는 여전히 사용할 수 없습니다 ( 관련 질문 참조 ).

  2. .NET Framework에서는에 상주System.dll 하므로 HttpUtility. 와 달리 추가 참조가 필요하지 않습니다 .

  3. 그것은 제대로 URL에 대한 문자를 이스케이프 는 달리, Uri.EscapeUriString(참조 drweb86의 대답에 의견을 ).

  4. 문자열의 길이에 어떤 제한이없는 달리, Uri.EscapeDataString(참조 관련 질문을 )은 예를 들어, POST 요청을 사용할 수 있도록.


답변

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
  • 유니 코드 : HttpUtility.UrlEncodeUnicode
  • UrlPathEncoded : HttpUtility.UrlPathEncode
  • WebUtilityUrlEncoded : WebUtility.UrlEncode
  • 이스케이프 된 데이터 문자열 : Uri.EscapeDataString
  • EscapedUriString : Uri.EscapeUriString
  • 인코딩 된 : HttpUtility.HtmlEncode
  • 인코딩 된 HtmlAttribute : HttpUtility.HtmlAttributeEncode
  • WebUtilityHtml 인코딩 : WebUtility.HtmlEncode
  • HexEscaped : Uri.HexEscape

노트:

  1. HexEscape는 처음 255 자만 처리 할 수 ​​있습니다. 따라서 라틴 A 확장 문자 (예 : Â)에 대해 ArgumentOutOfRange 예외가 발생합니다.

  2. 이 테이블은 .NET 4.5에서 생성되었습니다 ( .NET 4.0 이하의 인코딩에 대해서는 https://stackoverflow.com/a/11236038/216440 참조).

편집하다:

  1. Discord의 답변 결과 .NET 4.5에 도입 된 새로운 WebUtility UrlEncode 및 HtmlEncode 메서드를 추가했습니다.

답변

.NET에서는 URL 인코딩이 쉽습니다. 사용하다:

System.Web.HttpUtility.UrlEncode(string url)

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