Mit Javascript ist atob zu decodieren base64 nicht richtig Dekodieren von utf-8 strings
Ich bin mit der Javascript - window.atob()
Funktion zum Dekodieren einer base64-kodierten string (speziell die base64-kodierten Inhalt aus dem GitHub-API). Problem ist, ich bin immer ASCII-codierte Zeichen zurück (wie â¢
statt ™
). Wie kann ich die ordnungsgemäße Abwicklung der eingehenden base64-codierten stream, so dass es dekodiert utf-8?
Die MDN-Seite, die Sie verlinkt hat, ein Absatz, beginnend mit dem Satz "Für die Verwendung mit Unicode-oder UTF-8-strings".
Sind Sie auf Knoten? Es gibt bessere Lösungen als
Sind Sie auf Knoten? Es gibt bessere Lösungen als
atob
InformationsquelleAutor brandonscript | 2015-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine tolle Artikel auf Mozilla MDN docs, beschreibt genau dieses Problem:
Ein Hinweis auf die bisherigen Lösungen: der MDN-Artikel, ursprünglich vorgeschlagen
unescape
undescape
zu lösen, dieCharacter Out Of Range
Ausnahme problem, aber seitdem wurden Sie als veraltet markiert. Einige andere Antworten hier vorgeschlagen haben, arbeiten, um dieses mitdecodeURIComponent
undencodeURIComponent
, dies hat sich als unzuverlässig und unberechenbar. Das neueste update dieser Antwort benutzt moderne JavaScript-Funktionen, um die Geschwindigkeit zu erhöhen und zu modernisieren-code.Wenn Sie versuchen, sparen Sie sich die Zeit, Sie könnten auch erwägen Sie die Verwendung einer Bibliothek:
Encoding UTF8 ⇢ base64
Decodieren von base64 ⇢ UTF8
Die pre-2018-Lösung (funktional, und obwohl wahrscheinlich eine bessere Unterstützung für ältere Browser, die nicht up-to-date)
Hier ist die aktuelle Empfehlung, direkt aus MDN, mit einigen zusätzlichen Typoskript Kompatibilität via @MA-Maddin:
Der ursprünglichen Lösung (veraltet)
Diese verwendet
escape
undunescape
(die sind jetzt veraltet, obwohl diese noch funktioniert in allen modernen Browsern):Und eine Letzte Sache: ich traf zuerst dieses problem beim aufrufen der GitHub API. Um diese arbeiten auf die (Mobile) Safari richtig, ich hatte tatsächlich zu entfernen, Leerzeichen aus dem base64-Quelle vor konnte ich noch entschlüsseln, die Quelle. Ob oder nicht, dies ist immer noch relevant, im Jahr 2017, ich weiß nicht:
Sie rettete meine Tage, bro
Update: Lösung #1 in MDN "Unicode-Problem" wurde behoben,
b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU=');
jetzt richtig ausgegeben "✓ à la mode"Ein anderer Weg, zu entschlüsseln wäre
decodeURIComponent(atob('4pyTIMOgIGxhIG1vZGU=').split('').map(x => '%' + x.charCodeAt(0).toString(16)).join(''))
Nicht die performanten code, aber es ist was es ist.Die base64-js link ist tot?
InformationsquelleAutor brandonscript
Dinge zu ändern. Die escape/unescape Methoden wurden als veraltet markiert.
Können Sie URI Kodieren Sie die Zeichenfolge, bevor Sie die Base64-codieren. Beachten Sie, dass diese gar nicht produzieren, Base64-codiert in UTF8, sondern in Base64-kodierter URL-kodierte Daten. Beide Seiten müssen sich auf die gleiche Codierung.
Siehe Beispiel hier: http://codepen.io/anon/pen/PZgbPW
Für OP ' s problem eine Drittanbieter-Bibliothek wie js-base64 sollte das problem lösen.
Sie sind richtig, ich habe aktualisiert die text-zu-Punkt, aus. Danke. Die alternative scheint zu sein, die Umsetzung base64 sich selbst, mit einer Drittanbieter-Bibliothek (wie z.B. js-base64) oder empfangen ("Error: Failed to execute 'btoa' auf 'Fenster': Der string kodiert werden, enthält Zeichen außerhalb des Latin1-Bereich."
InformationsquelleAutor Tedd Hansen
Wenn die Behandlung von strings als bytes mehr Ihre Sache ist, können Sie die folgenden Funktionen verwenden
InformationsquelleAutor Riccardo Galli
Hier wird 2018 aktualisiert-Lösung, wie beschrieben, in der Mozilla-Development-Ressourcen
ZU KODIEREN VON UNICODE in B64
ZU DEKODIEREN, die VON der B64 AUF UNICODE
InformationsquelleAutor Manuel G
Kleine Korrektur, unescape und Flucht sind veraltet, so:
Das wird nicht funktionieren, weil
encodeURIComponent
ist die inverse vondecodeURIComponent
, d.h. es wird nur die Umwandlung rückgängig. Siehe stackoverflow.com/a/31412163/1534459 für eine große Erklärung dessen, was geschieht mitescape
undunescape
.Ich verstehe nicht, Ihren Kommentar? escape-und unescape veraltet sind, habe ich Sie einfach tauschen diese mit [decode|encode]URIComponent Funktion 🙂 Alles wird gut funktionieren. Lesen Sie die erste Frage
Der Grund, warum
encodeURIComponent
verwendet wird, ist korrekt zu verarbeiten (die ganze Reihe) von unicode-Zeichenfolgen. So z.B.window.btoa(decodeURIComponent(encodeURIComponent('€')))
gibtError: String contains an invalid character
weil es das gleiche ist wiewindow.btoa('€')
undbtoa
kann nicht codieren€
.Ja, das ist richtig. Aber Sie können nicht die swap-Flucht mit Alsterrunde und unescape mit DecodeURIComponent, weil die Codierung und die Flucht Methoden nicht das gleiche tun. Gleiche mit decode&unescape. Ich hatte ursprünglich den gleichen Fehler gemacht, btw. Sie sollten beachten, dass wenn Sie eine Zeichenfolge, UriEncode, dann UriDecode es, Sie bekommen den gleichen string zurück, das Sie eingegeben haben. So, dass wäre Unsinn. Wenn Sie unescape eine Zeichenkette kodiert werden, alsterrunde, Sie erhalten nicht die gleiche Zeichenfolge zurück, die Sie eingegeben, also mit escape/unescape es funktioniert, aber nicht mit Ihnen.
InformationsquelleAutor Darkves
Hier einige zukunftssicheren code für Browser, die möglicherweise fehlen
escape/unescape()
. Beachten Sie, dass IE 9 und älter unterstützen nichtatob/btoa()
, so müssten Sie use custom base64-Funktionen für Sie.Ein umfassenderes Beispiel für UTF-8-Kodierung und-Dekodierung kann hier gefunden werden: http://jsfiddle.net/47zwb41o/
InformationsquelleAutor Beejor
einschließlich der oben genannten Lösung ist, wenn noch immer mit Problem versuchen, wie unten, Considerign der Fall, wo die Flucht wird nicht unterstützt für TS.
für csv_content können Sie versuchen, wie unten.
InformationsquelleAutor Diwakar