it-swarm.com.de

Verwendung von encodeURI () vs. escape () für utf-8-Zeichenfolgen in JavaScript

Ich arbeite mit utf-8-Strings in JavaScript und muss sie entziehen.

Sowohl escape ()/unescape () als auch encodeURI ()/decodeURI () funktionieren in meinem Browser.

Flucht()

> var hello = "안녕하세요"
> var hello_escaped = escape(hello)
> hello_escaped
  "%uC548%uB155%uD558%uC138%uC694"
> var hello_unescaped = unescape(hello_escaped)
> hello_unescaped
  "안녕하세요"

encodeURI ()

> var hello = "안녕하세요"    
> var hello_encoded = encodeURI(hello)
> hello_encoded
  "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"
> var hello_decoded = decodeURI(hello_encoded)
> hello_decoded
  "안녕하세요"

Mozilla sagt jedoch, dass escape () veraltet ist .

Obwohl encodeURI () und decodeURI () mit der obigen utf-8-Zeichenfolge arbeiten, sagen mir die docs (sowie die Funktionsnamen selbst), dass diese Methoden für URIs sind. Utf-8-Zeichenketten werden nirgendwo erwähnt. 

Ist es einfach in Ordnung, encodeURI () und decodeURI () für utf-8-Strings zu verwenden?

15
SeanPlusPlus

Hallo!

Wenn es um escape und unescape geht, lebe ich nach zwei Regeln:

  1. Vermeiden Sie sie, wenn Sie leicht können.
  2. Ansonsten verwenden Sie sie.

Sie vermeiden, wenn Sie leicht können:

Wie in der Frage erwähnt, wurden sowohl escape als auch unescape nicht mehr unterstützt. Im Allgemeinen sollte man auf veraltete Funktionen verzichten.

Wenn also encodeURIComponent oder encodeURI den Trick für Sie erledigt, sollten Sie dies anstelle von escape verwenden.

Verwenden Sie sie, wenn Sie sie nicht ohne weiteres vermeiden können:

Browser werden, soweit möglich, die Abwärtskompatibilität anstreben. Alle gängigen Browser haben bereits escape und unescape implementiert. Warum sollten sie sie nicht implementieren?

Browser müssen escapeund unescape neu definieren, wenn die neue Spezifikation dies erfordert. Aber warte! Die Leute, die Spezifikationen schreiben, sind ziemlich schlau. Auch sie sind daran interessiert, die Rückwärtskompatibilität nicht zu brechen!

Mir ist klar, dass das obige Argument schwach ist. Aber glauben Sie mir, ... wenn es um Browser geht, funktionieren veraltete Sachen. Dies beinhaltet sogar veraltete HTML-Tags wie <xmp> und <center>.

Verwendung von escape und unescape:

Die nächste Frage ist natürlich, wann würde man escape oder unescape verwenden?

Vor kurzem musste ich bei CloudBrave mit utf8, latin1 und Inter-Conversions umgehen.

Nachdem ich ein paar Blogbeiträge gelesen hatte, wurde mir klar, wie einfach dies war:

var utf8_to_latin1 = function (s) {
    return unescape(encodeURIComponent(s));
};
var latin1_to_utf8 = function (s) {
    return decodeURIComponent(escape(s));
};

Diese Interkonvertierungen, ohne escape und unescape zu verwenden, sind eher involviert. Wenn Sie escape und unescape nicht vermeiden, wird das Leben einfacher.

Hoffe das hilft.

15
Sumukh Barve

Mozilla sagt, dass escape () veraltet ist.

Ja, Sie sollten sowohl escape() als auch unescape() vermeiden


Ist es in Ordnung, encodeURI () und decodeURI () für utf-8-Zeichenfolgen zu verwenden?

Ja, aber abhängig von der Form Ihrer Eingabe und der erforderlichen Form Ihrer Ausgabe benötigen Sie möglicherweise zusätzliche Arbeit.

Aus Ihrer Frage gehe ich davon aus, dass Sie eine JavaScript-Zeichenfolge haben und die Codierung in UTF-8 konvertieren und die Zeichenfolge schließlich in einer maskierten Form speichern möchten.

Zunächst ist zu beachten, dass JavaScript-Zeichenfolgen, die UCS-2 enthalten, ähnlich wie UTF-16 und von UTF-8 verschieden sind.

Siehe: https://mathiasbynens.be/notes/javascript-encoding

encodeURIComponent() ist gut für den Job, da der UCS-2-JavaScript-String in UTF-8 umgewandelt und in Form einer Folge von %nn - Teilzeichenfolgen ausgeblendet wird, wobei jedes nn das ist zwei hexadezimale Ziffern jedes Bytes.

Allerdings kann encodeURIComponent() Buchstaben, Ziffern und einige andere Zeichen im Bereich ASCII) nicht maskieren. Dies ist jedoch leicht zu beheben.

Wenn Sie beispielsweise eine JavaScript-Zeichenfolge in ein Zahlenfeld umwandeln möchten, das die Bytes der UTF-8-codierten Originalzeichenfolge darstellt, können Sie diese Funktion verwenden:

//
// Convert JavaScript UCS2 string to array of bytes representing the string UTF8 encoded
//

function StringUTF8AsBytesArrayFromString( s )
{
    var i,
        n,
        u;

    u = [];
    s = encodeURIComponent( s );

    n = s.length;
    for( i = 0; i < n; i++ )
    {
        if( s.charAt( i ) == '%' )
        {
            u.Push( parseInt( s.substring( i + 1, i + 3 ), 16 ) );
            i += 2;
        }
        else
        {
            u.Push( s.charCodeAt( i ) );
        }
    }

    return u;
}

Wenn Sie die Zeichenfolge in ihrer hexadezimalen Darstellung drehen möchten:

//
// Convert JavaScript UCS2 string to hex string representing the bytes of the string UTF8 encoded
//

function StringUTF8AsHexFromString( s )
{
    var u,
        i,
        n,
        s;

    u = StringUTF8AsBytesArrayFromString( s );
    n = u.length;
    s = '';    

    for( i = 0; i < n; i++ )
    {
        s += ( u[ i ] < 16 ? '0' : '' ) + u[ i ].toString( 16 );
    }

    return s;
}

Wenn Sie die Zeile in der for-Schleife in ändern

s += '%' + ( u[ i ] < 16 ? '0' : '' ) + u[ i ].toString( 16 );

(Hinzufügen des Zeichens % vor jeder hexadezimalen Ziffer)

Die resultierende Escape-Zeichenfolge (UTF-8-codiert) kann mit decodeURIComponent() wieder in eine JavaScript-UCS-2-Zeichenfolge umgewandelt werden.

1
Paolo