sollte encodeDEI jemals verwendet werden?

8

Gibt es eine gültige Verwendung für die encodeURI-Funktion von Javascript?

Soweit ich das beurteilen kann, sollten Sie, wenn Sie versuchen, eine HTTP-Anfrage zu machen, folgendes haben:

  • eine vollständige URI
  • ein Fragment, das Sie in einen URI einfügen möchten, der entweder eine Unicode-Zeichenfolge oder eine UTF-8-Bytefolge
  • ist

Im ersten Fall muss offensichtlich nichts getan werden, um es anzufordern. Hinweis: Wenn Sie es tatsächlich als Parameter übergeben möchten (z. B.? Url = http ...), haben Sie tatsächlich eine Instanz des zweiten Falls, die wie ein URI aussieht.

Im zweiten Fall sollten Sie immer eine Unicode-Zeichenfolge in UTF-8 konvertieren und dann encodeURIComponent aufrufen, um alle Zeichen zu vermeiden, bevor Sie sie zu einem URI hinzufügen. (Wenn Sie eine UTF-8-Byte-Sequenz anstelle einer Unicode-Zeichenfolge haben, können Sie den Schritt convert-to-utf8 überspringen).

Angenommen, ich habe nichts verpasst, kann ich keine gültige Verwendung für encodeURI sehen. Wenn Sie es verwenden, ist es wahrscheinlich, dass Sie einen ungültigen URI erstellt haben und dann versucht haben, ihn nach der Tat "zu bereinigen", was einfach nicht möglich ist, da Sie nicht wissen, welche Zeichen wörtlich gemeint waren und welche maskiert werden sollten .

Ich habe eine Menge Ratschläge gegen die Verwendung von escape () gesehen, sehe aber niemanden, der encodeURI abschreckt. Fehle ich eine gültige Verwendung?

    
gfxmonk 12.02.2012, 00:29
quelle

2 Antworten

10

Ich habe einen Blogpost , der beantwortet diese Frage in vielen Details.

Sie sollten nie encodeURI verwenden, um einen URI programmatisch zu konstruieren, aus den Gründen, die Sie sagen - Sie sollten immer encodeURIComponent für die einzelnen Komponenten verwenden und sie dann zu einem vollständigen URI zusammenstellen .

Wo encodeURI ist fast nützlich ist in "Reinigung" eine URI, in Übereinstimmung mit Postel's Law ("Seien Sie liberal in dem, was Sie akzeptieren, und konservativ in dem, was Sie senden.") Wenn Ihnen jemand einen vollständigen URI gibt, kann er unzulässige Zeichen wie Leerzeichen, bestimmte ASCII-Zeichen (wie Anführungszeichen) enthalten. und Unicode-Zeichen. encodeURI kann verwendet werden, um diese unzulässigen Zeichen in legale prozentgemaschte Sequenzen zu konvertieren, ohne die Begrenzer zu codieren. Auf ähnliche Weise kann decodeURI verwendet werden, um einen URI "hübsch auszudrucken", wobei Prozent-Escape-Sequenzen als technisch unzulässige nackte Zeichen angezeigt werden.

Zum Beispiel die URL:

%Vor%

ist illegal, aber es ist immer noch völlig eindeutig. encodeURI konvertiert es in den gültigen URI:

%Vor%

Ein Beispiel für eine Anwendung, die diese Art von "URI-Bereinigung" durchführen möchte, ist ein Webbrowser. Wenn Sie eine URL in die Adressleiste eingeben, sollte sie versuchen, alle ungültigen Zeichen in Prozent-Escapes zu konvertieren, anstatt nur einen Fehler zu haben. Software, die URIs verarbeitet (z. B. ein HTML-Scraper, der alle URLs in Hyperlinks auf einer Seite abrufen möchte), kann diese Art der Bereinigung auch dann anwenden, wenn eine der URLs technisch unzulässig ist.

Unglücklicherweise hat encodeURI einen kritischen Fehler, nämlich, dass es "%" - Zeichen entkommt, wodurch es für die URI-Bereinigung völlig unbrauchbar wird (es wird doppelt jeder URI entkommen, der bereits Prozent-Escapes hatte). Ich habe mir deshalb Mozilla's fixedEncodeURI -Funktion ausgeliehen und sie so verbessert, dass sie URIs korrekt bereinigt:

%Vor%

Sie sollten also immer encodeURIComponent verwenden, um URIs intern zu erstellen. Sie sollten niemals encodeURI verwenden, aber Sie können my fixedEncodeURI verwenden, um URIs zu bereinigen, die von einer externen Quelle stammen (normalerweise als Teil einer Benutzerschnittstelle).

    
mgiuca 12.02.2012, 08:11
quelle
5

encodeURI codiert nicht Folgendes:, /? : @ & amp; = + $ # während encodeURIComponent.

Es gibt eine Vielzahl von Gründen, warum Sie encodeURI über encodeURIComponent verwenden sollten, z. B. eine URL als Variablenwert zuweisen. Sie möchten die URL beibehalten, aber Pfade, Abfragezeichenfolgen und Hashwerte codieren. Die Verwendung von encodeURIComponent würde die URL ungültig machen.

    
Mad Man Moon 12.02.2012 02:01
quelle

Tags und Links