私はVBのフォーラムソフトウェアにPOSTリクエストを送り、誰かにログインさせるアプリケーションを持っています(クッキーやその他の設定なしで)。
ユーザーがログインしたら、自分のローカルマシンにパスを作成する変数を作成します。
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値または文字を簡単に識別できるその他の値です。
編集:この答えは古くなっていることに注意してください。見る下のSiarhei Kuchukの答えより良い修正方法
UrlEncodingはあなたがここで提案していることをするでしょう。 C#では、単に使うだけです。HttpUtility
、 述べたように。
不正な文字を正規表現に置き換えて置き換えることもできますが、正しい文字に置き換えるには何らかの形式のステートマシン(switch ...など)が必要になるため、はるかに複雑になります。からUrlEncode
これは事前に行います、それはかなり簡単です。
LinuxとWindowsの場合は、Linuxでは許容されないWindowsにはない文字がいくつかありますが、フォルダ名はUrl文字列をデコードすることで返されるので、心配しないでください。UrlDecode
だから、あなたは変更を往復することができます。
A potentially dangerous Request.Path value was detected from the client
。 - Learning
私は、.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 < < %3C
= %3d %3d = %3D = = = %3D
> %3e %3e > %3E %3E > > %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
16進数:Uri.HexEscape
ノート:
HexEscape
最初の255文字しか扱えません。それ故にそれは投げますArgumentOutOfRange
ラテンA拡張文字(例:Â)を除く。
このテーブルは.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();
}
}
}
}
UrlPathEncode
。だから基本的に交換UrlPathEncode
とUri.EscapeUriString
。 - Andrew
ユーザー名または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");
うまくいけば、それは役立ちます。また、のどか言及した、あなたはまだ違法なファイル名の文字が削除されているか、そうでなければファイルシステムがパスを好きではないことを確認する必要があります。
?
(クエリ文字列はすでにエンコードされていると想定しているため)。 Dan Herbertの例では、彼のふりをしているようです。Example
エンコーディングが必要なテキストです。HttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");
動作しませんでした。一緒に試してみる?q=Ex&ple
(望ましい結果が?q=Ex%26ple
) (1)UrlPathEncodeが後に何も触れないため、動作しませんでした?
(2)UrlPathEncodeがエンコードされない&
とにかく。 - Tim Goodman&
クエリ文字列パラメータを区切るためにそれが必要だからです。ただし、エンコードされたアンパサンドも必要な場合があります。 - Tim Goodman
より良い方法は使うことです
.net 4のフルプロフィールを参照しないために。
Uri.EscapeDataString
ではないUri.EscapeUriString
このコメントを読んで、それは私を助けました。 - ykadaru
から.NET Framework 4.5あなたが使用することができますWebUtility.UrlEncode
。
まず、それ在住System.dll
そのため、追加の参照は必要ありません。
第二に、それURLの文字を正しくエスケープするとは違ってUri.EscapeUriString
(drweb86の回答へのコメントを参照)
第三に、それ文字列の長さに制限はありませんとは違ってUri.EscapeDataString
(見る関連質問そのため、たとえばPOSTリクエストに使用できます。
第四に、それはWinRTで利用可能とは違ってHttpUtility
(見る関連質問)
Levi Botelhoさんは、以前に生成されたエンコーディングのテーブルは.NET 4.5では正確ではなくなったとコメントしました。エンコーディングは.NET 4.0と4.5の間でわずかに変更されたためです。それで私は.NET 4.5のためにテーブルを再生成しました:
Unencoded UrlEncoded UrlEncodedUnicode UrlPathEncoded WebUtilityUrlEncoded EscapedDataString EscapedUriString HtmlEncoded HtmlAttributeEncoded WebUtilityHtmlEncoded HexEscaped
A A A A A A A A A A %41
B B B B B B B B B B %42
a a a a a a a a a a %61
b b b b b b b b b b %62
0 0 0 0 0 0 0 0 0 0 %30
1 1 1 1 1 1 1 1 1 1 %31
[space] + + %20 + %20 %20 [space] [space] [space] %20
! ! ! ! ! %21 ! ! ! ! %21
" %22 %22 " %22 %22 %22 " " " %22
# %23 %23 # %23 %23 # # # # %23
$ %24 %24 $ %24 %24 $ $ $ $ %24
% %25 %25 % %25 %25 %25 % % % %25
& %26 %26 & %26 %26 & & & & %26
' %27 %27 ' %27 %27 ' ' ' ' %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 < < < %3C
= %3d %3d = %3D %3D = = = = %3D
> %3e %3e > %3E %3E %3E > > > %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]
列は次のようにエンコードを表します。
HttpUtility.UrlEncode
HttpUtility.UrlEncodeUnicode
HttpUtility.UrlPathEncode
WebUtility.UrlEncode
Uri.EscapeDataString
Uri.EscapeUriString
HttpUtility.HtmlEncode
HttpUtility.HtmlAttributeEncode
WebUtility.HtmlEncode
Uri.HexEscape
ノート:
HexEscapeは最初の255文字しか処理できません。したがって、ラテンA拡張文字(たとえばÂ)に対してArgumentOutOfRange例外がスローされます。
このテーブルは.NET 4.5で作成されました(answerを参照)https://stackoverflow.com/a/11236038/216440.NET 4.0以下に関連するエンコーディングについては、
編集:
(Net4.0) ? %3f................................
(Net4.5) ? %3f ..................................
- T.Todua
URLエンコードは.NETで簡単です。つかいます:
System.Web.HttpUtility.UrlEncode(string url)
フォルダ名を取得するためにそれがデコードされる場合でも、フォルダ名に使用できない文字(*、?、/など)を除外する必要があります。
System.Webが表示されない場合は、プロジェクト設定を変更してください。ターゲットフレームワークは「.NET Framework 4 Client Profile」ではなく「.NET Framework 4」にしてください。
の.NETの実装UrlEncode
RFC 3986に準拠していません。
一部の文字はエンコードされていませんが、する必要があります。の!()*
文字はRFCのセクション2.2にエンコードされなければならない予約文字として記載されていますが、.NETはこれらの文字をエンコードすることができません。
一部の文字はエンコードされていますが、そうすべきではありません。の.-_
文字はまだエンコードされるべきでない予約文字としてRFCのセクション2.2に記載されていません。NETはこれらの文字を誤ってエンコードします。
RFCは、一貫性を保つために、実装では大文字のHEXDIGを使用するように指定しています。NETでは、小文字のHEXDIGが生成されます。
理想的には、これらは "FileNaming"と呼ばれるクラスに入るか、あるいは単にEncodeを "FileNameEncode"に変更します。注意:これらはフルパスを処理するようには設計されておらず、フォルダやファイルの名前だけを処理します。理想的には、最初にフルパスを分割( "/")してからその部分をチェックします。 そして明らかに共用体の代わりに、あなたはただ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!
私はすべてのシンボルを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();
}
@Dan Herbertの回答に加えて、 あなたは一般的に値だけをエンコードするべきです。
Splitには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);
}
}
}