Utiliser encodeURI () vs escape () pour les chaînes utf-8 en JavaScript
Je suis la manipulation des chaînes utf-8 dans le JavaScript et le besoin de s'échapper.
Échapper() /ne pas encoder() et encodeURI() /decodeURI() dans mon navigateur.
escape()
> 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
"안녕하세요"
Cependant, Mozilla dit que escape() est obsolète.
Bien que encodeURI() et decodeURI() fonctionnent au-dessus de chaîne utf-8, la documentation (ainsi que les noms des fonctions elles-mêmes) de me dire que ces méthodes sont pour les Uri; je ne vois pas l'utf-8 cordes mentionné nulle part.
Tout simplement, est-il acceptable d'utiliser encodeURI() et decodeURI() pour des chaînes utf-8?
source d'informationauteur SeanPlusPlus
Vous devez vous connecter pour publier un commentaire.
Hi!
Quand il s'agit de
escape
etunescape
je vis par les deux règles suivantes:De les éviter lorsque vous facilement pouvez:
Comme mentionné dans la question, à la fois
escape
etunescape
ont été dépréciés. En général, il faut éviter d'utiliser obsolète fonctions.Donc, si
encodeURIComponent
ouencodeURI
fait le truc pour vous, vous devez l'utiliser au lieu deescape
.De les utiliser quand vous ne pouvez pas facilement les éviter:
Des navigateurs, dans la mesure du possible, s'efforcer de parvenir à une compatibilité descendante. Tous les principaux navigateurs ont déjà mis en œuvre
escape
etunescape
; pourquoi seraient-ils de l'onu-les mettre en œuvre?Les navigateurs ne doivent redéfinir
escape
etunescape
si la nouvelle spécification oblige à le faire. Mais attendez! Les gens qui écrivent les spécifications sont assez intelligents. Ils sont aussi intéressés à ne pas casser la compatibilité descendante!Je me rends compte que l'argumentation est faible. Mais faites-moi confiance, ... quand il s'agit de navigateurs, obsolète œuvres de trucs. Cela inclut même obsolète balises HTML comme
<xmp>
et<center>
.À l'aide de
escape
etunescape
:Alors, naturellement, la prochaine question est, quand on utilise
escape
ouunescape
?Récemment, en travaillant sur des CloudBravej'ai eu à traiter avec
utf8
latin1
et inter-conversions de.Après avoir lu un tas d'articles de blog, j'ai réalisé comment simple c'est:
De ces inter-conversions, sans l'aide de
escape
etunescape
sont plutôt impliqués. En n'évitant pasescape
etunescape
la vie devient plus simple.Espère que cette aide.
Oui, vous devriez éviter les
escape()
etunescape()
Oui, mais selon la forme de votre entrée et de la forme de votre sortie, vous pouvez avoir besoin de travail supplémentaire.
De votre question, je suppose que vous avez un JavaScript chaîne et que vous voulez convertir l'encodage UTF-8 et enfin stocker la chaîne de caractères dans certains échappé à la forme.
Tout d'abord, il est important de noter que les chaînes de caractères JavaScript enconding est UCS-2, comme de l'UTF-16, différent de l'UTF-8.
Voir: https://mathiasbynens.be/notes/javascript-encoding
encodeURIComponent()
est bon pour le travail comme les virages, l'UCS-2 JavaScript chaîne en UTF-8 et s'échappe sous la forme d'une séquence de%nn
sous-chaînes où chaquenn
est les deux chiffres hexadécimaux de chaque octet.Cependant
encodeURIComponent()
n'échappe pas à lettres, de chiffres et de quelques autres personnages de la plage ASCII. Mais c'est facile à corriger.Par exemple, si vous souhaitez activer JavaScript chaîne en un tableau de nombres représentant les octets de la chaîne d'origine codé en UTF-8, vous pouvez utiliser cette fonction:
Si vous souhaitez activer la chaîne dans sa représentation hexadécimale:
Si vous changer de ligne dans la boucle for dans
s += '%' + ( u[ i ] < 16 ? '0' : '' ) + u[ i ].toString( 16 );
(ajout de la
%
signe avant chaque chiffre hexadécimal)L'résultant échappé à la chaîne de caractères (UTF-8) peuvent être transformés en un JavaScript UCS-2 chaîne avec
decodeURIComponent()