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 값 또는 문자를 쉽게 식별 할 수있는 다른 값입니다.
편집 :이 답변은 지금 구식입니다. 만나다아래 Siarhei Kuchuk의 대답더 나은 수정을 위해
UrlEncoding은 여기서 제안한 것을 할 것입니다. C #을 사용하면HttpUtility
, 말한 바와 같이.
또한 잘못된 문자를 정규식으로 대체 한 다음 바꿀 수도 있지만 올바른 문자로 바꿀 수있는 상태 머신 (스위치 ... 대소 문자 등)을 사용해야하므로 훨씬 복잡해집니다. 이후UrlEncode
이 일을 앞당긴다. 그것은 쉽다.
리눅스 대 윈도우에 관해서는, 리눅스에 수용 가능한 몇몇 문자가 있습니다. 윈도우에서는 그렇지 않습니다 만, 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
HexEscaped :Uri.HexEscape
노트:
HexEscape
처음 255 자만 처리 할 수 있습니다. 따라서 그것은ArgumentOutOfRange
Latin A-Extended 문자 (예 : Â)는 예외입니다.
이 테이블은 .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();
}
}
}
}
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");
잘하면 도움이됩니다. 또한,teedyay언급했듯이 불법적 인 파일 이름 문자가 제거되었는지 확인해야합니다. 그렇지 않으면 파일 시스템이 경로를 좋아하지 않습니다.
?
(쿼리 문자열이 이미 인코딩되었다고 가정하기 때문에). 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.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 " " " %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 자만 처리 할 수 있습니다. 따라서 Latin A-Extended 문자 (예 : Â)에 대해서는 ArgumentOutOfRange 예외가 발생합니다.
이 테이블은 .NET 4.5에서 생성되었습니다 (응답 참조).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는 일관성을 유지하기 위해 .NET에서 소문자 HEXDIG를 생성하는 대문자 HEXDIG를 사용해야한다고 명시합니다.
이상적으로 이것들은 "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에게 감사드립니다!
모든 기호를 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();
}
@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);
}
}
}