'How to use strings with JavaScript Typed Arrays
I've come across a problem in that I don't see a way to easily convert strings to typed arrays, and converting from typed arrays to strings appears to be a real pain requiring a manual char code conversion for every byte. Is there any better methods to convert strings to typed arrays or vise-versa?
Example:
I have a UTF8 encoded string, "Something or other", and I want to write it to an ArrayBuffer in length then string format.
Solution 1:[1]
This should solve your problem
How to use strings with JavaScript Typed Arrays
JS Strings are stored in UTF-16 encoding where each character takes 2 bytes. String.charCodeAt returns these 2-byte Unicodes. This is how to read UTF-16 encoded strings from a DataView:
DataView.prototype.getUTF16String = function(offset, length) {
var utf16 = new ArrayBuffer(length * 2);
var utf16View = new Uint16Array(utf16);
for (var i = 0; i < length; ++i) {
utf16View[i] = this.getUint8(offset + i);
}
return String.fromCharCode.apply(null, utf16View);
};
and these functions to convert string to and from arraybuffer
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
Solution 2:[2]
You can use TextEncoder and TextDecoder, it was originally only implemented in Firefox, but has since gained wider support. This two full years after your initial question :)
Fortunately, there exists a polyfill that does the job.
var initialString = "Something or other";
var utf8EncodedString = new TextEncoder("utf-8").encode(initialString);
// utf8EncodedString is a Uint8Array, so you can inspect
// the individual bytes directly:
for (var i = 0; i < utf8EncodedString.length; ++i) {
console.log(utf8EncodedString[i]);
}
var decodedString = new TextDecoder("utf-8").decode(utf8EncodedString);
if (initialString !== decodedString) {
console.error("You're lying!");
}
Solution 3:[3]
If you are willing to use external libraries, you can take a look at jDataView which supports reading strings in different encodings from a TypedArray and handles endianness conversion as well.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Benjamin Gruenbaum |
| Solution 2 | Ciro Santilli Путлер Капут å…四事 |
| Solution 3 | Mauro D. |
