NEWS
Readfile() json => Ergebnis mal Object mal ArrayBuffer
-
Ließ mal https://nodejs.org/api/fs.html
Das liegt daran das du (Annahme weil hast leider deinen Code nicht gepostet) kein encoding setzt.
Ob du dann ein String oder ein arraybuffer bekommst hängt davon ab wie das encoding der Datei ist.
Wenn du auch ein encoding angibst sollte es immer ein String sein.
Gesendet vom Handy …
-
Ich nutze die connection class aus der conn.js des socket.io Adapters. Dort sieht die Funktion wie folge aus:
readFile: function (filename, callback, isRemote) { if (!callback) throw 'No callback set'; if (this._type === 'local') { try { var data = storage.get(filename); callback(null, data ? JSON.parse(storage.get(filename)) : null); } catch (err) { callback(err, null); } } else { if (!this._checkConnection('readFile', arguments)) return; if (!isRemote && typeof app !== 'undefined' && !app.settings.dontCache) { app.readLocalFile(filename.replace(/^\/vis\.0\//, ''), callback); } else { var adapter = this.namespace; if (filename[0] === '/') { var p = filename.split('/'); adapter = p[1]; p.splice(0, 2); filename = p.join('/'); } this._socket.emit('readFile', adapter, filename, function (err, data, mimeType) { setTimeout(function () { callback(err, data, filename, mimeType); }, 0); }); } } },
Dort scheint es keinen Option bzgl. der Angabe der Codierung zu geben.
-
Dann musst Du ggf den ArrayBuffer in String umwandeln indem Du da das Encoding nutzt
-
Mich wundert nur, dass es mit einem File geht und mit einem anderen nicht
Ich werd nicht so ganz schlau daraus…
-
Zudem werd ich aus den Infos aus dem Web nicht ganz schlau.
In dem ArrayBuffer des JSON Files liegen ja unterschiedlich Arrays drin. (siehe Screen) Welches nehme ich und wie kann ich es sinnvoll dekodieren.
4236_arraybuffer.jpg -
Google is your friend :-))
https://github.com/inexorabletash/text-encoding
keine Ahnung hab ich auch noch nie gemacht
-
Danke für Deine Hilfe. Zur Vollständigkeit
- Statt eine Lösung für unzählige Encodings einzubinden behelfe ich mir mit einer kleinen Funktion die UTF8Arrays konvertiert.
convertUtf8ArrayToStr:function(array) { var out, i, len, c; var char2, char3; out = ""; len = array.length; i = 0; while(i < len) { c = array[i++]; switch(c >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: // 0xxxxxxx out += String.fromCharCode(c); break; case 12: case 13: // 110x xxxx 10xx xxxx char2 = array[i++]; out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); break; case 14: // 1110 xxxx 10xx xxxx 10xx xxxx char2 = array[i++]; char3 = array[i++]; out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)); break; } } return out; }
Da ich noch keine richtige Lösung gefunden habe wie ich sicher checke ob der Return Value ein ArrayBuffer ist statt eines Strings behelfe ich mir im Moment damit zu Checken ob der Return Value ein Object ist und hole dann das Uint8Array aus dem Buffer. Dann check ich ob der Typ wieder ein Object ist und wandle dann um in einen String.
if(typeof theData == 'object'){ var uint8Array = new Uint8Array(theData); if(typeof uint8Array == 'object'){ theData = ngl.convertUtf8ArrayToStr(uint8Array); } }
Sollte es dafür eine bessere / plausiblere Lösung geben bin ich für Tips dankbar.
LG
-
Da ich noch keine richtige Lösung gefunden habe wie ich sicher checke ob der Return Value ein ArrayBuffer ist statt eines Strings behelfe ich mir im Moment damit zu Checken ob der Return Value ein Object ist und hole dann das Uint8Array aus dem Buffer. Dann check ich ob der Typ wieder ein Object ist und wandle dann um in einen String.
Sollte es dafür eine bessere / plausiblere Lösung geben bin ich für Tips dankbar. `
Wie wäre es mit
if (theData instanceof Uint8Array) { // bzw instanceof ArrayBuffer // ... }
-
Das ergibt bei mir false
Wenn ich anhand meines Codes oben
if(uint8Array instanceof Uint8Array)
checke dann natürlich true. Das kann ich auch mit
if(ArrayBuffer.isView(uint8Array))
machen. So mache ich es mitterweile. Allerdings habe ich bei beiden Varianten das View schon aus dem ArrayBuffer geholt.
Mir war eher dran gelegen ob ich einfach prüfen kann ob der Return ein ArrayBuffer ist.
LG
-
Sorry theData instanceof ArrayBuffer funzt natürlich… Danke!