Inspiré par la réponse de @ hgoebl. Son code est pour UTF-16 et j'avais besoin de quelque chose pour US-ASCII. Voici donc une réponse plus complète couvrant US-ASCII, UTF-16 et 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 est de longueur variable et n'est pas inclus car je devrais écrire l'encodage moi-même. UTF-8 et UTF-16 sont de longueur variable. UTF-8, UTF-16 et UTF-32 ont un nombre minimum de bits comme leur nom l'indique. Si un caractère UTF-32 a un point de code de 65, cela signifie qu'il y a 3 0 non significatifs. Mais le même code pour UTF-16 n'a qu'un seul 0 en tête. L'US-ASCII, en revanche, est de largeur fixe de 8 bits, ce qui signifie qu'il peut être directement traduit en octets.
String.prototype.charCodeAtrenvoie un nombre maximum de 2 octets et correspond exactement à UTF-16. Cependant pour UTF-32 String.prototype.codePointAtest nécessaire qui fait partie de la proposition ECMAScript 6 (Harmony). Étant donné que charCodeAt renvoie 2 octets, ce qui est plus de caractères possibles que l'US-ASCII ne peut représenter, la fonction stringToAsciiByteArraylancera dans de tels cas au lieu de diviser le caractère en deux et de prendre l'un ou les deux octets.
Notez que cette réponse n'est pas triviale car le codage des caractères n'est pas trivial. Le type de tableau d'octets souhaité dépend du codage de caractères que vous souhaitez que ces octets représentent.
javascript a la possibilité d'utiliser en interne UTF-16 ou UCS-2, mais comme il a des méthodes qui agissent comme UTF-16, je ne vois pas pourquoi un navigateur utiliserait UCS-2. Voir aussi: https://mathiasbynens.be/notes/javascript-encoding
Oui, je sais que la question a 4 ans mais j'avais besoin de cette réponse pour moi-même.