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?
Hallo!
Wenn es um escape
und unescape
geht, lebe ich nach zwei Regeln:
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.
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 escape
und 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>
.
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.
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.