Ich verwende die Javascript- window.atob()
Funktion, um eine Base64-codierte Zeichenfolge zu dekodieren (insbesondere den Base64-codierten Inhalt der GitHub-API). Das Problem ist, dass ich ASCII-codierte Zeichen zurück bekomme (wie â¢
anstelle von ™
). Wie kann ich den eingehenden Base64-codierten Stream richtig verarbeiten, damit er als utf-8 dekodiert wird?
javascript
encoding
utf-8
Brandonscript
quelle
quelle
atob
Antworten:
Es gibt einen großartigen Artikel in Mozillas MDN-Dokumenten, der genau dieses Problem beschreibt:
Ein Hinweis zu früheren Lösungen: Der MDN-Artikel schlug ursprünglich vor , das Ausnahmeproblem zu verwenden
unescape
undescape
zu lösenCharacter Out Of Range
, aber seitdem sind sie veraltet. Einige andere Antworten hier haben vorgeschlagen , um diese Arbeit mitdecodeURIComponent
undencodeURIComponent
hat diese unzuverlässig und unberechenbar erwiesen. Das neueste Update dieser Antwort verwendet moderne JavaScript-Funktionen, um die Geschwindigkeit zu verbessern und den Code zu modernisieren.Wenn Sie versuchen, sich Zeit zu sparen, können Sie auch eine Bibliothek verwenden:
Codierung von UTF8 ⇢ base64
Decodieren von base64 ⇢ UTF8
Die Lösung vor 2018 (funktionale und wahrscheinlich bessere Unterstützung für ältere Browser, nicht auf dem neuesten Stand)
Hier ist die aktuelle Empfehlung direkt von MDN mit einigen zusätzlichen TypeScript-Kompatibilitäten über @ MA-Maddin:
Die ursprüngliche Lösung (veraltet)
Dies verwendet
escape
undunescape
(die jetzt veraltet sind, obwohl dies immer noch in allen modernen Browsern funktioniert):Und noch eine letzte Sache: Ich bin zum ersten Mal auf dieses Problem gestoßen, als ich die GitHub-API aufgerufen habe. Damit dies auf (Mobile) Safari ordnungsgemäß funktioniert, musste ich tatsächlich den gesamten Leerraum von der base64-Quelle entfernen, bevor ich die Quelle überhaupt dekodieren konnte. Ob dies 2017 noch relevant ist oder nicht, weiß ich nicht:
quelle
b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU=');
jetzt wird korrekt "✓ à la mode"decodeURIComponent(atob('4pyTIMOgIGxhIG1vZGU=').split('').map(x => '%' + x.charCodeAt(0).toString(16)).join(''))
nicht der leistungsstärkste Code, aber es ist, was es ist.return String.fromCharCode(parseInt(p1, 16));
TypeScript-Kompatibilität haben.Dinge ändern sich. Die Escape- / Unescape- Methoden sind veraltet.
Sie können die Zeichenfolge mit einem URI codieren, bevor Sie sie mit Base64 codieren. Beachten Sie, dass hierdurch kein Base64-codiertes UTF8 erzeugt wird, sondern Base64-codierte URL-codierte Daten. Beide Seiten müssen sich auf die gleiche Kodierung einigen.
Siehe Arbeitsbeispiel hier: http://codepen.io/anon/pen/PZgbPW
Für das Problem von OP sollte eine Bibliothek eines Drittanbieters wie js-base64 das Problem lösen.
quelle
Wenn Sie Strings eher als Bytes behandeln möchten, können Sie die folgenden Funktionen verwenden
quelle
Hier ist die 2018 aktualisierte Lösung, wie in den Mozilla-Entwicklungsressourcen beschrieben
VON UNICODE NACH B64 ENCODIEREN
VON B64 ZU UNICODE DEKODIEREN
quelle
Ich würde annehmen, dass man eine Lösung möchte, die einen weit verbreiteten base64-URI erzeugt. Bitte besuchen Sie
data:text/plain;charset=utf-8;base64,4pi44pi54pi64pi74pi84pi+4pi/
, um eine Demonstration zu sehen (kopieren Sie die Daten-URL, öffnen Sie eine neue Registerkarte, fügen Sie die Daten-URI in die Adressleiste ein und drücken Sie die Eingabetaste, um zur Seite zu gelangen). Trotz der Tatsache, dass dieser URI base64-codiert ist, kann der Browser die hohen Codepunkte weiterhin erkennen und ordnungsgemäß decodieren. Der minimierte Encoder + Decoder ist 1058 Bytes (+ Gzip → 589 Bytes)Unten finden Sie den Quellcode, mit dem er generiert wurde.
Um die base64-Daten zu dekodieren, ruft HTTP die Daten entweder als Daten-URI ab oder verwendet die folgende Funktion.
Der Vorteil von mehr Standard ist, dass dieser Encoder und dieser Decoder breiter anwendbar sind, da sie als gültige URL verwendet werden können, die korrekt angezeigt wird. Beobachten.
Die oben genannten Codefragmente sind nicht nur sehr standardisiert, sondern auch sehr schnell. Anstelle einer indirekten Folgekette, bei der die Daten mehrmals zwischen verschiedenen Formen konvertiert werden müssen (wie in Riccardo Gallis Antwort), ist das obige Codefragment so direkt wie möglich. Es wird nur ein einfaches Fasten verwendet . Das i-Tüpfelchen ist schließlich, dass Zeichenfolgen, die keine Codepunkte über 0x7f enthalten, für Benutzer mit lateinischem Skript-Exclūsīvō besonders schnell verarbeitet werden können, da die Zeichenfolge durch den Ersetzungsalgorithmus unverändert bleibt.
String.prototype.replace
Aufruf zum Verarbeiten der Daten beim Codieren und nur ein Aufruf zum Decodieren der Daten beim Decodieren verwendet. Ein weiteres Plus ist, dassString.prototype.replace
der Browser (insbesondere bei großen Zeichenfolgen) die zugrunde liegende Speicherverwaltung für die Größenänderung der Zeichenfolge automatisch übernimmt, was insbesondere bei immergrünen Browsern wie Chrome und Firefox, die stark optimiert sind, zu einer erheblichen Leistungssteigerung führtString.prototype.replace
Ich habe ein Github-Repository für diese Lösung unter https://github.com/anonyco/BestBase64EncoderDecoder/ erstellt.
quelle
Der vollständige Artikel, der für mich funktioniert: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding
Der Teil, in dem wir von Unicode / UTF-8 codieren, ist
Dies ist heutzutage eine der am häufigsten verwendeten Methoden.
quelle
Kleine Korrekturen, Flucht und Flucht sind veraltet, also:
quelle
encodeURIComponent
es umgekehrt istdecodeURIComponent
, dh es wird nur die Konvertierung rückgängig gemacht. Unter stackoverflow.com/a/31412163/1534459 finden Sie eine ausführliche Erklärung, was mitescape
und passiertunescape
.encodeURIComponent
verwendet wird, ist die korrekte Behandlung (des gesamten Bereichs von) Unicode-Zeichenfolgen. Also zBwindow.btoa(decodeURIComponent(encodeURIComponent('€')))
gibt es,Error: String contains an invalid character
weil es das gleiche ist wiewindow.btoa('€')
undbtoa
nicht codieren kann€
.Hier ist ein zukunftssicherer Code für Browser, die möglicherweise fehlen
escape/unescape()
. Beachten Sie, dass IE 9 und älter dies nicht unterstützenatob/btoa()
. Sie müssen daher benutzerdefinierte base64-Funktionen für sie verwenden.Ein umfassenderes Beispiel für die UTF-8-Codierung und -Decodierung finden Sie hier: http://jsfiddle.net/47zwb41o/
quelle
Wenn Sie immer noch auf ein Problem stoßen, versuchen Sie es wie folgt. Betrachten Sie den Fall, in dem Escape für TS nicht unterstützt wird.
Für csv_content können Sie es wie folgt versuchen.
quelle