468 Stimmen

URL-Kodierung mit C#

Ich habe eine Anwendung, die eine POST-Anfrage an die VB-Forensoftware sendet und jemanden anmeldet (ohne Cookies oder ähnliches zu setzen).

Sobald der Benutzer angemeldet ist, erstelle ich eine Variable, die einen Pfad auf seinem lokalen Rechner erstellt.

c: \tempfolder\date\username

Das Problem ist, dass einige Benutzernamen eine "Illegal chars"-Ausnahme auslösen. Zum Beispiel, wenn mein Benutzername war mas|fenix würde es eine Ausnahme auslösen.

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

Ich möchte sie nicht aus dem String entfernen, aber ein Ordner mit ihrem Benutzernamen wird per FTP auf einem Server erstellt. Und das führt zu meiner zweiten Frage. Wenn ich einen Ordner auf dem Server erstelle, kann ich dann die "illegalen Zeichen" drin lassen? Ich frage das nur, weil der Server auf Linux basiert und ich mir nicht sicher bin, ob Linux das akzeptiert oder nicht.

EDIT: Es scheint, dass die URL-Kodierung nicht das ist, was ich will Hier ist, was ich tun möchte:

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

Dabei ist %xx der ASCII-Wert oder ein anderer Wert, mit dem das Zeichen leicht identifiziert werden kann.

105voto

Simon Tewsi Punkte 15527

Levi Botelho bemerkte, dass die zuvor erstellte Tabelle der Kodierungen für .NET 4.5 nicht mehr korrekt ist, da sich die Kodierungen zwischen .NET 4.0 und 4.5 leicht geändert haben. Daher habe ich die Tabelle für .NET 4.5 neu erstellt:

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              &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

A         %c4%80     %u0100            %c4%80         %C4%80               %C4%80            %C4%80           A           A                    A                     [OoR]
a         %c4%81     %u0101            %c4%81         %C4%81               %C4%81            %C4%81           a           a                    a                     [OoR]
E         %c4%92     %u0112            %c4%92         %C4%92               %C4%92            %C4%92           E           E                    E                     [OoR]
e         %c4%93     %u0113            %c4%93         %C4%93               %C4%93            %C4%93           e           e                    e                     [OoR]
I         %c4%aa     %u012a            %c4%aa         %C4%AA               %C4%AA            %C4%AA           I           I                    I                     [OoR]
i         %c4%ab     %u012b            %c4%ab         %C4%AB               %C4%AB            %C4%AB           i           i                    i                     [OoR]
O         %c5%8c     %u014c            %c5%8c         %C5%8C               %C5%8C            %C5%8C           O           O                    O                     [OoR]
o         %c5%8d     %u014d            %c5%8d         %C5%8D               %C5%8D            %C5%8D           o           o                    o                     [OoR]
U         %c5%aa     %u016a            %c5%aa         %C5%AA               %C5%AA            %C5%AA           U           U                    U                     [OoR]
u         %c5%ab     %u016b            %c5%ab         %C5%AB               %C5%AB            %C5%AB           u           u                    u                     [OoR]

Die Spalten stellen die folgenden Kodierungen dar:

  • 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

ANMERKUNGEN:

  1. HexEscape kann nur die ersten 255 Zeichen verarbeiten. Daher wird für die lateinischen A-erweiterten Zeichen (z. B. A) eine ArgumentOutOfRange-Ausnahme ausgelöst.

  2. Diese Tabelle wurde in .NET 4.5 erstellt (siehe Antwort https://stackoverflow.com/a/11236038/216440 für die Kodierungen, die für .NET 4.0 und darunter relevant sind).

EDITAR:

  1. Infolge der Antwort von Discord habe ich die neuen WebUtility-Methoden UrlEncode und HtmlEncode hinzugefügt, die in .NET 4.5 eingeführt wurden.

75voto

teedyay Punkte 22763

Url-Kodierung ist in .NET einfach. Verwenden:

System.Web.HttpUtility.UrlEncode(string url)

Wenn das dekodiert wird, um den Ordnernamen zu erhalten, müssen Sie immer noch Zeichen ausschließen, die in Ordnernamen nicht verwendet werden dürfen (*, ?, /, usw.)

12voto

useful Punkte 452

Wenn Sie System.Web nicht sehen können, ändern Sie Ihre Projekteinstellungen. Das Ziel-Framework sollte ".NET Framework 4" anstelle von ".NET Framework 4 Client Profile" sein.

10voto

Charlie Punkte 8006

Die .NET-Implementierung von UrlEncode nicht mit RFC 3986 übereinstimmt.

  1. Einige Zeichen sind nicht verschlüsselt, sollten es aber sein. Die !()* Zeichen sind in Abschnitt 2.2 des RFC als reservierte Zeichen aufgeführt, die kodiert werden müssen, aber .NET kann diese Zeichen nicht kodieren.

  2. Einige Zeichen sind kodiert, sollten es aber nicht sein. Die .-_ Zeichen sind in Abschnitt 2.2 des RFC nicht als reservierte Zeichen aufgeführt, die nicht kodiert werden sollten, dennoch kodiert .NET diese Zeichen fälschlicherweise.

  3. Der RFC legt fest, dass Implementierungen aus Konsistenzgründen HEXDIG in Großbuchstaben verwenden sollten, während .NET HEXDIG in Kleinbuchstaben erzeugt.

6voto

Gerard ONeill Punkte 3528

Ich glaube, die Leute hier haben sich von der UrlEncode-Nachricht ablenken lassen. URLEncoding ist no was Sie wollen - Sie wollen Dinge kodieren, die auf dem Zielsystem nicht als Dateinamen funktionieren.

Unter der Annahme, dass Sie eine gewisse Allgemeingültigkeit anstreben, können Sie die unzulässigen Zeichen auf verschiedenen Systemen (MacOS, Windows, Linux und Unix) finden und sie zu einer Reihe von Zeichen zusammenfassen, die entkommen sollen.

Was den Escape betrifft, so sollte ein HexEscape ausreichen (Ersetzen der Zeichen durch %XX). Konvertieren Sie jedes Zeichen in UTF-8-Bytes und kodieren Sie alles >128, wenn Sie Systeme unterstützen wollen, die keinen Unicode verwenden. Es gibt aber auch andere Möglichkeiten, z. B. die Verwendung von umgekehrten Schrägstrichen "\" oder die HTML-Kodierung """. Sie können Ihre eigenen erstellen. Alles, was ein System tun muss, ist, das nicht kompatible Zeichen wegzukodieren". Mit den oben genannten Systemen können Sie den ursprünglichen Namen wiederherstellen - aber es funktioniert auch, indem Sie die schlechten Zeichen durch Leerzeichen ersetzen.

Auf der gleichen Tangente wie oben, ist die einzige zu verwendende

Uri.EscapeDataString

-- Es kodiert alles, was für OAuth benötigt wird, es kodiert nicht die Dinge, deren Kodierung OAuth verbietet, und kodiert das Leerzeichen als %20 und nicht als + (auch in der OATH-Spezifikation) Siehe: RFC 3986. AFAIK ist dies die neueste URI-Spezifikation.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X