Ich habe einige UTF-8-codierte Daten, die in einer Reihe von Uint8Array-Elementen in Javascript leben. Gibt es eine effiziente Möglichkeit, diese in eine reguläre Javascript-Zeichenfolge zu dekodieren (ich glaube, Javascript verwendet 16-Bit-Unicode)? Ich möchte nicht jeweils ein Zeichen hinzufügen, da die String-Konzentration zu CPU-intensiv werden würde.
javascript
Jack Wester
quelle
quelle
u8array.toString()
beim Lesen von Dateien aus BrowserFS, die das Uint8Array-Objekt beim Aufrufen verfügbar machenfs.readFile
.toString
beiUint8Array
Rückgabe durch Kommas getrennte Zahlen wie"91,50,48,49,57,45"
(Chrome 79)Antworten:
TextEncoder
undTextDecoder
aus dem Encoding-Standard , der von der Stringencoding-Bibliothek mehrfach ausgefüllt wird, wird zwischen Strings und ArrayBuffers konvertiert:quelle
npm install text-encoding
,var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;
. Nein Danke.utf-8
. DasTextEncoder
Argument ist also unnötig!TextEncoder
/TextDecoder
APIs in Version 11 hinzugefügt hat, sodass keine zusätzlichen Pakete installiert werden müssen, wenn Sie nur auf aktuelle Node-Versionen abzielen.Das sollte funktionieren:
Es ist etwas sauberer als die anderen Lösungen, da es keine Hacks verwendet oder von Browser-JS-Funktionen abhängt, z. B. auch in anderen JS-Umgebungen.
Schauen Sie sich die JSFiddle-Demo an .
Siehe auch die entsprechenden Fragen: hier und hier
quelle
fromUTF8Array([240,159,154,133])
leer (währendfromUTF8Array([226,152,131])→"☃"
)Folgendes verwende ich:
quelle
RangeError
größere Texte auf. "Maximale Call-Stack-Größe überschritten"SCRIPT28: Out of stack space
wenn ich es 300 + k Zeichen füttere, oderRangeError
für Chrome 39. Firefox 33 ist in Ordnung. 100 + k läuft mit allen drei in Ordnung.Gefunden in einer der Chrome-Beispielanwendungen, obwohl dies für größere Datenblöcke gedacht ist, bei denen Sie mit einer asynchronen Konvertierung einverstanden sind.
quelle
In Node "
Buffer
Instanzen sind auchUint8Array
Instanzen ",buf.toString()
funktioniert also in diesem Fall.quelle
Buffer
ist auch Uint8Array. Vielen Dank!Buffer.from(uint8array).toString('utf-8')
Die von Albert angegebene Lösung funktioniert gut, solange die bereitgestellte Funktion nur selten aufgerufen wird und nur für Arrays mit bescheidener Größe verwendet wird. Andernfalls ist sie äußerst ineffizient. Hier ist eine erweiterte Vanille-JavaScript-Lösung, die sowohl für Knoten als auch für Browser funktioniert und die folgenden Vorteile bietet:
• Funktioniert effizient für alle Oktett-Array-Größen
• Erzeugt keine wegwerfbaren Zwischenzeichenfolgen
• Unterstützt 4-Byte-Zeichen in modernen JS-Engines (andernfalls wird "?" Ersetzt)
quelle
Tun Sie, was @Sudhir gesagt hat, und verwenden Sie dann Folgendes, um einen String aus der durch Kommas getrennten Liste von Zahlen zu entfernen:
Dadurch erhalten Sie die gewünschte Zeichenfolge, sofern diese noch relevant ist
quelle
String.fromCharCode.apply(null, unitArr);
. Wie bereits erwähnt, wird die UTF8-Codierung nicht verarbeitet. Manchmal ist dies jedoch einfach genug, wenn Sie nur ASCII-Unterstützung benötigen, aber keinen Zugriff auf TextEncoder / TextDecoder haben.Wenn Sie die TextDecoder-API nicht verwenden können, weil sie im IE nicht unterstützt wird :
quelle
Probieren Sie diese Funktionen aus,
Quelle: https://gist.github.com/tomfa/706d10fed78c497731ac , ein großes Lob an Tomfa
quelle
Ich war frustriert zu sehen, dass die Leute nicht zeigten, wie man in beide Richtungen geht oder dass die Dinge mit keinen trivialen UTF8-Strings funktionieren. Ich habe auf codereview.stackexchange.com einen Beitrag gefunden , der Code enthält, der gut funktioniert. Ich habe es benutzt, um alte Runen in Bytes umzuwandeln, um Krypo auf den Bytes zu testen und dann Dinge wieder in einen String umzuwandeln. Der Arbeitscode ist hier auf Github . Ich habe die Methoden aus Gründen der Klarheit umbenannt:
Der Komponententest verwendet diese UTF-8-Zeichenfolge:
Beachten Sie, dass die Zeichenfolgenlänge nur 117 Zeichen beträgt, die Bytelänge bei Codierung jedoch 234.
Wenn ich die Konsolen.log-Zeilen auskommentiere, kann ich sehen, dass die Zeichenfolge, die dekodiert wird, dieselbe Zeichenfolge ist, die codiert wurde (wobei die Bytes durch Shamirs geheimen Freigabealgorithmus geleitet werden!):
quelle
String.fromCharCode.apply(null, chars)
wird Fehler, wennchars
zu groß ist.In NodeJS stehen Puffer zur Verfügung, und die Konvertierung von Zeichenfolgen mit ihnen ist wirklich einfach. Besser, es ist einfach, ein Uint8Array in einen Puffer zu konvertieren. Probieren Sie diesen Code aus, er funktioniert in Node für jede Konvertierung mit Uint8Arrays:
Wir extrahieren nur den ArrayBuffer aus dem Uint8Array und konvertieren ihn dann in einen richtigen NodeJS-Puffer. Dann konvertieren wir den Puffer in eine Zeichenfolge (Sie können eine Hex- oder Base64-Codierung eingeben, wenn Sie möchten).
Wenn wir von einem String zurück in ein Uint8Array konvertieren möchten, würden wir dies tun:
Beachten Sie, dass Sie, wenn Sie beim Konvertieren in eine Zeichenfolge eine Codierung wie base64 deklariert haben, diese verwenden müssen,
Buffer.from(str, "base64")
wenn Sie base64 oder eine andere von Ihnen verwendete Codierung verwendet haben.Dies funktioniert im Browser ohne Modul nicht! NodeJS-Puffer sind im Browser einfach nicht vorhanden, daher funktioniert diese Methode nur, wenn Sie dem Browser Pufferfunktionen hinzufügen. Das ist eigentlich ziemlich einfach, benutze einfach ein Modul wie dieses , das sowohl klein als auch schnell ist!
quelle
`
quelle
Ich verwende dieses Typescript-Snippet:
Entfernen Sie die Typanmerkungen, wenn Sie die JavaScript-Version benötigen. Hoffe das hilft!
quelle