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 < < %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
-
유니 코드 :
HttpUtility.UrlEncodeUnicode
-
UrlPathEncoded :
HttpUtility.UrlPathEncode
-
이스케이프 된 데이터 문자열 :
Uri.EscapeDataString
-
EscapedUriString :
Uri.EscapeUriString
-
인코딩 된 :
HttpUtility.HtmlEncode
-
인코딩 된 HtmlAttribute :
HttpUtility.HtmlAttributeEncode
-
HexEscaped :
Uri.HexEscape
노트:
-
HexEscape
처음 255 자만 처리 할 수 있습니다. 따라서ArgumentOutOfRange
라틴 A- 확장 문자 (예 : Â) 에는 예외 가 발생합니다. -
이 테이블은 .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가 언급했듯이 불법 파일 이름 문자를 제거하지 않으면 파일 시스템이 경로를 좋아하지 않아야합니다.
답변
답변
이후 .NET 프레임 워크 4.5 및 .NET 표준 1.0 당신은 사용해야합니다 WebUtility.UrlEncode
. 대안에 비해 장점 :
-
.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에서는 여전히 사용할 수 없습니다 ( 관련 질문 참조 ). -
.NET Framework에서는에 상주
System.dll
하므로HttpUtility
. 와 달리 추가 참조가 필요하지 않습니다 . -
그것은 제대로 URL에 대한 문자를 이스케이프 는 달리,
Uri.EscapeUriString
(참조 drweb86의 대답에 의견을 ). -
이 문자열의 길이에 어떤 제한이없는 달리,
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 " " " %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]
열은 다음과 같이 인코딩을 나타냅니다.
- 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
노트:
-
HexEscape는 처음 255 자만 처리 할 수 있습니다. 따라서 라틴 A 확장 문자 (예 : Â)에 대해 ArgumentOutOfRange 예외가 발생합니다.
-
이 테이블은 .NET 4.5에서 생성되었습니다 ( .NET 4.0 이하의 인코딩에 대해서는 https://stackoverflow.com/a/11236038/216440 참조).
편집하다:
- Discord의 답변 결과 .NET 4.5에 도입 된 새로운 WebUtility UrlEncode 및 HtmlEncode 메서드를 추가했습니다.
답변
.NET에서는 URL 인코딩이 쉽습니다. 사용하다:
System.Web.HttpUtility.UrlEncode(string url)
폴더 이름을 가져 오기 위해 디코딩 된 경우에도 폴더 이름에 사용할 수없는 문자 (*,?, / 등)를 제외해야합니다.