Inspirado pela resposta de @hgoebl. Seu código é para UTF-16 e eu precisava de algo para US-ASCII. Portanto, aqui está uma resposta mais completa cobrindo US-ASCII, UTF-16 e UTF-32.
function stringToAsciiByteArray(str)
{
var bytes = [];
for (var i = 0; i < str.length; ++i)
{
var charCode = str.charCodeAt(i);
if (charCode > 0xFF)
{
throw new Error('Character ' + String.fromCharCode(charCode) + ' can\'t be represented by a US-ASCII byte.');
}
bytes.push(charCode);
}
return bytes;
}
function stringToUtf16ByteArray(str)
{
var bytes = [];
for (var i = 0; i < str.length; ++i)
{
var charCode = str.charCodeAt(i);
bytes.push((charCode & 0xFF00) >>> 8);
bytes.push(charCode & 0xFF);
}
return bytes;
}
function stringToUtf32ByteArray(str)
{
var bytes = [];
for (var i = 0; i < str.length; i+=2)
{
var charPoint = str.codePointAt(i);
bytes.push((charPoint & 0xFF000000) >>> 24);
bytes.push((charPoint & 0xFF0000) >>> 16);
bytes.push((charPoint & 0xFF00) >>> 8);
bytes.push(charPoint & 0xFF);
}
return bytes;
}
UTF-8 tem comprimento variável e não está incluído porque eu mesmo teria que escrever a codificação. UTF-8 e UTF-16 são de comprimento variável. UTF-8, UTF-16 e UTF-32 têm um número mínimo de bits como seu nome indica. Se um caractere UTF-32 tiver um ponto de código de 65, isso significa que há 3 zeros à esquerda. Mas o mesmo código para UTF-16 tem apenas 1 inicial de 0. US-ASCII, por outro lado, tem largura fixa de 8 bits, o que significa que pode ser traduzido diretamente em bytes.
String.prototype.charCodeAtretorna um número máximo de 2 bytes e corresponde exatamente a UTF-16. Porém, para UTF-32 String.prototype.codePointAté necessário que faz parte da proposta ECMAScript 6 (Harmony). Como charCodeAt retorna 2 bytes, que são mais caracteres possíveis do que US-ASCII pode representar, a função stringToAsciiByteArraylançará nesses casos em vez de dividir o caractere ao meio e pegar um ou ambos os bytes.
Observe que essa resposta não é trivial porque a codificação de caracteres não é trivial. O tipo de array de bytes que você deseja depende de qual codificação de caracteres você deseja que esses bytes representem.
javascript tem a opção de usar internamente UTF-16 ou UCS-2, mas como possui métodos que agem como se fossem UTF-16, não vejo por que qualquer navegador usaria UCS-2. Veja também: https://mathiasbynens.be/notes/javascript-encoding
Sim, eu sei que a pergunta é de 4 anos, mas eu precisava dessa resposta para mim.