C#を使用したURLエンコーディング


340

VBフォーラムソフトウェアにPOSTリクエストを送信し、(Cookieやその他を設定せずに)ユーザーをログインさせるアプリケーションがあります。

ユーザーがログインしたら、ローカルマシンにパスを作成する変数を作成します。

c:\ tempfolder \ date \ username

問題は、一部のユーザー名が "Illegal chars"例外をスローしていることです。たとえば、ユーザー名がmas|fenix例外だった場合、例外がスローされます。

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

文字列から削除したくありませんが、ユーザー名のフォルダーがFTP経由でサーバーに作成されます。そして、これは私の2番目の質問につながります。サーバー上にフォルダーを作成している場合、「不正な文字」を残してもよいですか?サーバーがLinuxベースであり、Linuxがそれを受け入れるかどうかはわかりません。

編集:URLエンコードは私が望むものではないようです...これが私がやりたいことです:

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

ここで、%xxは、ASCII値、または文字を簡単に識別できるその他の値です。


ファイルシステムの安全なフォルダ名を作るためにこれを組み込む:http://stackoverflow.com/questions/333175/is-there-a-way-of-making-strings-file-path-safe-in-c
missaghi

回答:


191

編集:この回答は現在古くなっていることに注意してください。より良い修正方法については、以下のSiarhei Kuchukの回答を参照してください

UrlEncodingは、ここで提案されていることを実行します。C#では、HttpUtility前述のように単にを使用します。

不正な文字を正規表現に置き換えて置き換えることもできますが、正しい文字に置き換えるには何らかの形の状態マシン(たとえば、スイッチ...ケース)が必要になるため、これははるかに複雑になります。これUrlEncodeは前もって行うので、かなり簡単です。

窓の対Linux用として、WindowsではないのLinuxに許容されるいくつかの文字がありますが、フォルダ名を使用して、URL文字列をデコードして返すことができるように私は、その心配はないUrlDecodeので、あなたが往復することができ、変更。


5
この回答は現在古くなっています。以下のいくつかの回答をお読みください
blueberryfields

1
FTPの場合、Uriの各部分(フォルダーまたはファイル名)は、Uri.EscapeDataString(fileOrFolderName)を使用して作成でき、Uriと互換性のないすべての文字(スペース、Unicode ...)を許可します。たとえば、ファイル名に任意の文字を許可するには、次を使用します。req =(FtpWebRequest)WebRequest.Create(new Uri(path + "/" + Uri.EscapeDataString(filename))); HttpUtility.UrlEncode()を使用すると、スペースがプラス記号(+)に置き換えられます。検索エンジンでは正しい動作ですが、ファイル/フォルダー名では正しくありません。
Renaud Bancel、2015

asp.netは、jsスクリプトを追加しようとすると警告が表示されるため、url内のxssの大部分をブロックします A potentially dangerous Request.Path value was detected from the client
学習

510

.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文字しか処理できません。したがってArgumentOutOfRange、ラテンA拡張文字(例:Ā)の場合は例外がスローされます。

  2. このテーブルは.NET 4.0で生成されました(以下のLevi Botelhoのコメントを参照してください。.NET4.5のエンコーディングは少し異なります)。

編集:

.NET 4.5のエンコーディングを含む2番目のテーブルを追加しました。この回答を参照してください:https : //stackoverflow.com/a/21771206/216440

編集2:

人々はこれらのテーブルを高く評価しているように見えるので、テーブルを生成するソースコードが好きなので、自分で遊んでみたいと思いました。これは単純なC#コンソールアプリケーションで、.NET 4.0または4.5をターゲットにできます。

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

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

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

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

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

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

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

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

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

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

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

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

2
これは素晴らしい答えです。Uri.EscapeDataStringを使用し、System.Webを含めないようにしたいと思いました。このテーブルをありがとう。
Seravy

7
これは100%正確ではなくなっていることに注意してください。.NET 4と.NET 4.5の間で一部の機能がわずかに変更されました。stackoverflow.com/q/20003106/1068266を参照してください。
Levi Botelho 2014年

2
@リーバイ:頭を上げてくれてありがとう。.NET 4.5の表に2つ目の回答を追加しました。元の回答を編集して、2番目の表にリンクしました。
Simon Tewsi 14

.NETのドキュメントには「使用しない」と書かれていることに注意してください。ブラウザの互換性のみを目的としています。UrlEncodeを使用します。、しかしその方法は他の多くの望ましくない文字をエンコードします。最も近いのはUri.EscapeUriStringですが、null引数をサポートしていないことに注意してください。
Andrew

1
私は言及するのを忘れました、上の私のコメントはのためのものUrlPathEncodeです。だから、基本的に交換してくださいUrlPathEncodeUri.EscapeUriString
Andrew

278

無効である可能性のあるユーザー名またはURLの他の部分のみをエンコードする必要があります。URLをエンコードすると、次のような問題が発生する可能性があります。

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

収まる

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

これは明らかにうまくいきません。代わりに、次のように、クエリ文字列のキーと値のペアの値のみをエンコードする必要があります。

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

うまくいけば、それが役立ちます。また、teedyayが述べたように、違法なファイル名文字が削除されていることを確認する必要があります。そうしないと、ファイルシステムがパスを気に入らなくなります。


33
HttpUtility.UrlPathEncodeメソッドを使用すると、ここで説明している問題を防ぐことができます。
vipirtti 2009年

12
@DJ Pirtu:UrlPathEncodeがパスに望ましくない変更を加えないことは事実です?が、クエリ文字列が既にエンコードされていると想定しているため、その後も何もエンコードしません。ダンハーバートの例でExampleは、エンコーディングを必要とするテキストを装っているように見えるため、機能しHttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");ません。?q=Ex&ple(望ましい結果がである場合?q=Ex%26ple)で試してください。(1)UrlPathEncodeがの後?に何も触れないため、(2)UrlPathEncodeがエンコードしないため、機能しませ&ん。
Tim Goodman

1
ここを参照してください:connect.microsoft.com/VisualStudio/feedback/details/551839/… もちろん&、クエリ文字列パラメーターを区切るためにUrlPathEncodeがエンコードしないことを追加する必要があります。ただし、エンコードされたアンパサンドも必要な場合があります。
Tim Goodman

10
最新バージョンのHttpUtilityはWebUtilityに成功し、時間を節約できます:)
Wiseman

189

より良い方法は使用することです

Uri.EscapeUriString

.netのフルプロファイルを参照しないようにする4。


1
「クライアントプロファイル」はSystem.Netを使用しているがSystem.Webを使用していないアプリには十分なので、完全に同意します;-)
hfrmobile

6
OPはファイルシステムの互換性をチェックすることについて話しているため、これは機能しません。Windowsで許可されていない文字セットは '["/"、 "\\"、 "<"、 ">"、 ":"、 "\" "、" | "、"? "、" * "]ですが、これらの多くはEscapedUriStringを使用してエンコードしないでください(下の表を参照-その表@Simon Tewsiに感謝)...「ローカルマシンにパスを作成します」-OP UrlEncodedはほとんどすべての問題を処理しますが、解決しません「デコード」が元の入力とは異なるため、元の入力に「%」または「%3f」が含まれるという問題
m1m1k

6
明確にするためだけに:この回答はファイルシステムでは機能しません
m1m1k 2013

1
さらに、.NET Framework 4.5以降、クライアントプロファイルは廃止され、完全な再頒布可能パッケージのみが利用可能になりました。
mm

29
stackoverflow.com/a/34189188/3436164 Use Uri.EscapeDataStringNOT Uri.EscapeUriStringこのコメントを読んで、助けになりました。
ykadaru 2017年

181

.NET Framework 4.5および.NET Standard 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.EscapeUriStringdrweb86の回答へのコメントを参照)。

  4. これは、文字列の長さのいずれかの制限を持っていないとは異なり、Uri.EscapeDataString(参照関連する質問を)それは例えば、POSTリクエストのために使用することができるので、。


スペースの%20ではなく "+"を使用してエンコードする方法が好きです。しかし、これでもURLから "が削除されず、無効なURLが返されます...まあ、。replace("を実行する必要があるだけです。 "" ""、 "")
ピョートルクラ

84

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文字しか処理できません。そのため、ラテンA拡張文字(例:Ā)に対してArgumentOutOfRange例外がスローされます。

  2. このテーブルは.NET 4.5で生成されました(.NET 4.0以下に関連するエンコーディングについては、回答https://stackoverflow.com/a/11236038/216440を参照してください)。

編集:

  1. Discordの回答の結果として、.NET 4.5で導入された新しいWebUtility UrlEncodeメソッドとHtmlEncodeメソッドを追加しました。

2
いいえ、UrlPathEncodeは使用しないでください。MSDNでさえ、これは使用しないと言っています。これは、Netscape 2で問題を解決するために、ビルドしたmsdn.microsoft.com/en-us/library/...
ジェフ・

Server.URLEncodeはこのテーマのさらに別のバリエーションですか?異なる出力を生成しますか?
ALEXintlsos 2015年

2
@ALEX:ASP.NETでは、サーバーオブジェクトはHttpServerUtilityのインスタンスです。dotPeekデコンパイラーを使用して、HttpServerUtility.UrlEncodeを確認しました。HttpUtility.UrlEncodeを呼び出すだけなので、2つのメソッドの出力は同じになります。
Simon Tewsi、2015年

このようにエンコード方式が多すぎる場合でも、Latin-1を超えるもの(→や☠など)については、すべてが見事に失敗するようです。(UrlEncodedUnicodeは、少なくともUnicodeをサポートしようとしているように見えますが、非推奨/欠落しています。)
brianary

サイモン、この答えを受け入れられた答えに統合できますか?それを1つの答えにするといいでしょう。あなたはそれを統合してその答えの一番下にh1見出しを作るか、または1つのテーブルに統合して次のような異なる行をマークすることができます: (Net4.0) ? %3f................................ (Net4.5) ? %3f ..................................
T.Todua

60

URLエンコーディングは.NETでは簡単です。使用する:

System.Web.HttpUtility.UrlEncode(string url)

それをデコードしてフォルダー名を取得する場合でも、フォルダー名に使用できない文字(*、?、/など)を除外する必要があります。


アルファベットの一部ではないすべての文字をエンコードしますか?
masfenix 2009

1
URLエンコーディングは、URLで許可されていない文字を対応する文字エンティティに変換します。安全でない文字のリスト:blooberry.com/indexdot/html/topics/urlencoding.htm
Ian Robinson

HttpUtility.UrlEncode上のMSDNリンク:msdn.microsoft.com/en-us/library/4fkewx0t.aspx
Ian Robinson

11
完全なSystem.Web ...の部分を回答に含めることをお勧めします。これにより、多くの人々が少しの時間を節約できます:)ありがとう
Liam

3
これは危険です。URLのすべての文字をエンコードする必要はなく、クエリ文字列のパラメータの値のみをエンコードする必要があります。あなたが提案する方法は、クエリ文字列に複数のパラメータを作成するために必要な&もエンコードします。soutionは、必要に応じてパラメーターの各値をエンコードすることです
Marco Staffoli 2013年

12

System.Webが表示されない場合は、プロジェクト設定を変更してください。ターゲットフレームワークは、「。NET Framework 4 Client Profile」ではなく「.NET Framework 4」である必要があります


1
私の意見では、開発者は「.NETプロファイル」について知っておくべきであり、目的に合ったものを使用する必要があります。取得するために完全なプロファイルを追加するだけ(例:System.Web)、なぜ完全なプロファイルを追加するのかを本当に知らなくても、それほど賢くはありません。クライアントアプリには「クライアントプロファイル」を使用し、必要な場合にのみ完全プロファイルを使用します(たとえば、WinFormsまたはWPFクライアントは完全プロファイルではなくクライアントプロファイルを使用する必要があります)。たとえば、クライアントアプリでHttpServerUtilityを使用する理由がわかりません^^ ...これが必要な場合、アプリのデザインに問題があります!
hfrmobile 2012年

4
本当に?クライアントアプリでURLを作成する必要がありませんか?あなたは生活のために何をしますか-用務義務?
sproketboy 2013年

@hfrmobile:いいえ。これは、プロファイルモデル(一度しか存在せず、次のバージョンで放棄された)ですべて間違っています。そしてそれは最初から明らかでした。今あなたにとっては明らかですか?最初に考えて、msftがあなたを売ろうとしているものを「そのまま」すべて受け入れてはいけません; P
abatishchev

申し訳ありませんが、クライアントがURLを作成/使用する必要がないとは言っていません。.NET 4.0が使用されている限り、ユーザーはそれを気にする必要があります。簡単に言えば、開発者はHttpServerUtilityをクライアントに追加する前によく考えるべきです。他の/より良い方法があります。139票で回答を参照するか、「。NET Framework 4.5からWebUtility.UrlEncodeを使用できます。最初に、それはSystem.dllにあるため、追加の参照は必要ありません。」
hfrmobile 2014年

9

の.NET実装はUrlEncodeRFC 3986に準拠していません。

  1. 一部の文字はエンコードされていませんが、エンコードする必要があります。これらの!()*文字は、RFCのセクション2.2に、エンコードする必要がある予約文字としてリストされていますが、.NETはこれらの文字をエンコードできません。

  2. 一部の文字はエンコードされていますが、エンコードされるべきではありません。これらの.-_文字は、RFCのセクション2.2に記載されていませんが、まだエンコードしてはならない予約文字です。.NETはこれらの文字を誤ってエンコードします。

  3. RFCでは、一貫性を保つために、実装では大文字のHEXDIGを使用する必要があると規定しています。.NETでは小文字のHEXDIGが生成されます。


4

私は、ここの人々がUrlEncodeメッセージに見舞われたと思う。URLエンコードはありませんあなたが望むもの-あなたは、ターゲットシステム上のファイル名としては動作しませんエンコードのものにしたいです。

いくつかの一般性が必要だとすると、いくつかのシステム(MacOS、Windows、Linux、Unix)で違法な文字を自由に見つけて、それらを結合してエスケープする文字のセットを形成します。

エスケープについては、HexEscapeで問題ありません(文字を%XXで置き換えます)。ユニコードを実行しないシステムをサポートする場合は、各文字をUTF-8バイトに変換し、128を超えるすべてをエンコードします。ただし、バックスラッシュ「\」やHTMLエンコーディング「 "」を使用するなど、他の方法もあります。独自に作成することもできます。システムが実行する必要があるのは、互換性のない文字を「エンコード」することだけです。上記のシステムでは、元の名前-しかし、不正な文字をスペースで置き換えるようなものも機能します。

上記と同じ接線で、使用する唯一のものは

Uri.EscapeDataString

-OAuthに必要なすべてのものをエンコードし、OAuthがエンコードを禁止するものをエンコードせず、+ではなく%20としてスペースをエンコードします(OATH仕様でも参照)RFC 3986を参照してください。これは、最新のURI仕様。


3

すべてのシンボルをurlエンコードする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();
    }

1

理想的には、これらは「FileNaming」というクラスに配置するか、単にEncodeの名前を「FileNameEncode」に変更するだけです。注:これらは完全パスを処理するようには設計されておらず、フォルダ名やファイル名のみを処理します。理想的には、最初にフルパスをSplit( "/")してから、ピースをチェックします。そして明らかにユニオンの代わりに、「%」文字をWindowsで許可されていない文字のリストに追加することもできますが、この方法のほうがより便利で、読みやすく、実際的です。Decode()はまったく同じですが、Replace(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()
便利

はい。これを行う1つの方法を次に示します。foreach(System.IO.Path.GetInvalidFileNameChars()のchar c){filename = filename.Replace(c、 '_'); }
netfed

0

@Dan Herbertの回答に加えて、一般的に値だけをエンコードする必要があります。

Splitにはパラメーターパラメーター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);
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.