Ich bin mir nicht sicher, wie das heißt, also habe ich Probleme, danach zu suchen. Wie kann ich einen String mit Unicode von http\u00253A\u00252F\u00252Fexample.com
bis http://example.com
mit JavaScript dekodieren ? Ich habe es versucht unescape
, decodeURI
und decodeURIComponent
ich denke, das einzige, was noch übrig ist, ist das Ersetzen von Strings.
BEARBEITEN: Die Zeichenfolge ist nicht typisiert, sondern eine Teilzeichenfolge aus einem anderen Code. Um das Problem zu lösen, müssen Sie mit so etwas beginnen:
var s = 'http\\u00253A\\u00252F\\u00252Fexample.com';
Ich hoffe das zeigt, warum unescape () nicht funktioniert.
javascript
decode
urldecode
styfle
quelle
quelle
Antworten:
Bearbeiten (12.10.2017) :
@MechaLynx und @ Kevin-Weber stellen fest, dass dies
unescape()
in Nicht-Browser-Umgebungen veraltet ist und in TypeScript nicht vorhanden ist.decodeURIComponent
ist ein Ersatz. Verwenden Sie für eine bessere Kompatibilität stattdessen Folgendes:Ursprüngliche Antwort:
Sie können die gesamte Arbeit an auslagern
JSON.parse
quelle
unescape(JSON.parse('"' + s + '"'));
Was ist der Grund für die zusätzlichen Anführungszeichen? Ist JSON damit gültig?fromCharCode
Ansatz: jsperf.com/unicode-func-vs-json-parseJSON.parse('"' + s + '"')
wennJSON.parse('"' + s.replace('"', '\\"') + '"')
stattdessen nicht vertrauenswürdige Daten verwendet werden, da sonst Ihr Code beschädigt wird, wenn die Eingabe Anführungszeichen enthält.unescape()
es veraltet ist,decodeURIComponent()
funktioniert esunescape()
in diesem Fall identisch , also ersetzen Sie es einfach durch das und Sie sind gut.UPDATE : Bitte beachten Sie, dass dies eine Lösung ist, die für ältere Browser oder Nicht-Browser-Plattformen gelten sollte und zu Unterrichtszwecken am Leben gehalten wird. Eine aktuellere Antwort finden Sie in der Antwort von @radicand unten.
Dies ist eine Unicode-Zeichenfolge mit Escapezeichen. Zuerst wurde die Zeichenfolge maskiert und dann mit Unicode codiert. So konvertieren Sie wieder zum Normalzustand:
Zur Erklärung: Ich benutze einen regulären Ausdruck, um zu suchen
\u0025
. Da ich jedoch nur einen Teil dieser Zeichenfolge für meine Ersetzungsoperation benötige, verwende ich Klammern, um den Teil zu isolieren, den ich wiederverwenden werde0025
. Dieser isolierte Teil wird als Gruppe bezeichnet.Der
gi
Teil am Ende des Ausdrucks gibt an, dass er mit allen Instanzen in der Zeichenfolge übereinstimmen soll, nicht nur mit der ersten, und dass bei der Übereinstimmung die Groß- und Kleinschreibung nicht berücksichtigt werden soll. Dies mag angesichts des Beispiels unnötig erscheinen, erhöht jedoch die Vielseitigkeit.Um nun von einer Zeichenfolge zur nächsten zu konvertieren, muss ich einige Schritte für jede Gruppe jeder Übereinstimmung ausführen, und ich kann dies nicht durch einfaches Transformieren der Zeichenfolge tun. Hilfreicherweise kann die Operation String.replace eine Funktion akzeptieren, die für jede Übereinstimmung ausgeführt wird. Die Rückgabe dieser Funktion ersetzt die Übereinstimmung selbst in der Zeichenfolge.
Ich verwende den zweiten Parameter, den diese Funktion akzeptiert, nämlich die Gruppe, die ich verwenden muss, und transformiere ihn in die entsprechende utf-8-Sequenz. Verwenden Sie dann die integrierte
unescape
Funktion, um den String in die richtige Form zu dekodieren.quelle
\u
Präfix und dann nach einer 4-stelligen Hexadezimalzahl (Buchstaben oder Zahlen) sucht . Wie funktioniert die Funktion in der Ersetzungsmethode?var r = /\\u([\d\w]{1,})/gi;
JSON.parse
Ansatz: jsperf.com/unicode-func-vs-json-parseunescape()
verwenden können ,decodeURIComponent()
statt. In diesem Fall funktioniert es identisch. Ich würde jedoch den Ansatz von radicand empfehlen, da er einfacher, genauso unterstützt und schneller auszuführen ist und dieselben Ergebnisse liefert (lesen Sie jedoch unbedingt die Kommentare).Beachten Sie, dass die Verwendung von
unescape()
ist veraltet und funktioniert nicht mit dem Typoskript Compiler, zum Beispiel.Basierend auf der Antwort von radicand und dem Kommentarbereich unten ist hier eine aktualisierte Lösung:
http://example.com
quelle
Ich habe nicht genug Repräsentanten, um dies unter Kommentare zu den vorhandenen Antworten zu setzen:
unescape
wird nur für die Arbeit mit URIs (oder einem verschlüsselten utf-8) abgelehnt, was wahrscheinlich für die Bedürfnisse der meisten Menschen der Fall ist.encodeURIComponent
konvertiert einen js-String in Escape-UTF-8 unddecodeURIComponent
funktioniert nur mit Escape- UTF-8-Bytes. Es wird ein Fehler für etwasdecodeURIComponent('%a9'); // error
ausgelöst, weil erweitertes ASCII nicht gültig ist (obwohl dies immer noch ein Unicode-Wert ist), währendunescape('%a9'); // ©
Sie Ihre Daten kennen müssen, wenn Sie decodeURIComponent verwenden.decodeURIComponent funktioniert nicht
"%C2"
oder es wird kein einzelnes Byte überschritten,0x7f
da dies in utf-8 einen Teil eines Ersatzes angibt. AllerdingsdecodeURIComponent("%C2%A9") //gives you ©
würde Unescape nicht richtig funktionieren// ©
UND es würde keinen Fehler auslösen, so dass Unescape zu fehlerhaftem Code führen kann, wenn Sie Ihre Daten nicht kennen.quelle
Die Verwendung
JSON.decode
hierfür bringt erhebliche Nachteile mit sich, die Sie beachten müssen:JSON.decode
(nach ihnen in doppelten Anführungszeichen Einwickeln) werden Fehler , obwohl diese sind alle gültig:\\n
,\n
,\\0
,a"a
\\x45
\\u{045}
Es gibt auch andere Einschränkungen. Im Wesentlichen ist die Verwendung
JSON.decode
für diesen Zweck ein Hack und funktioniert nicht so, wie Sie es immer erwarten. Sie sollten dieJSON
Bibliothek weiterhin für JSON verwenden, nicht für Zeichenfolgenoperationen.Ich bin kürzlich selbst auf dieses Problem gestoßen und wollte einen robusten Decoder, also habe ich selbst einen geschrieben. Es ist vollständig und gründlich getestet und hier verfügbar: https://github.com/iansan5653/unraw . Es ahmt den JavaScript-Standard so genau wie möglich nach.
Erläuterung:
Die Quelle besteht aus ungefähr 250 Zeilen, daher werde ich hier nicht alles einfügen, aber im Wesentlichen wird der folgende Regex verwendet, um alle Escape-Sequenzen zu finden und sie dann zu analysieren
parseInt(string, 16)
, um die Basis-16-Zahlen zu dekodieren und dannString.fromCodePoint(number)
das entsprechende Zeichen zu erhalten:Kommentiert (HINWEIS: Dieser reguläre Ausdruck entspricht allen Escape-Sequenzen, einschließlich ungültiger. Wenn die Zeichenfolge einen Fehler in JS auslösen würde, würde dies einen Fehler in meiner Bibliothek auslösen [dh
'\x!!'
Fehler verursachen]):Beispiel
Verwenden dieser Bibliothek:
quelle