Натхненний відповіддю @ hgoebl. Його код призначений для UTF-16, і мені потрібно було щось для US-ASCII. Отже, ось більш повна відповідь, яка охоплює US-ASCII, UTF-16 та 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 має змінну довжину і не включається, тому що мені довелося б писати кодування самостійно. UTF-8 та UTF-16 мають змінну довжину. UTF-8, UTF-16 та UTF-32 мають мінімальну кількість бітів, як вказує їх назва. Якщо символ UTF-32 має кодову точку 65, це означає, що є 3 провідних 0. Але той же код для UTF-16 має лише 1 провідний 0. US-ASCII, з іншого боку, є фіксованою шириною 8 біт, що означає, що його можна безпосередньо перевести в байти.
String.prototype.charCodeAtповертає максимальну кількість 2 байт і точно відповідає UTF-16. Однак необхідний UTF-32 String.prototype.codePointAt, який є частиною пропозиції ECMAScript 6 (Harmony). Оскільки charCodeAt повертає 2 байти, що є більш можливими символами, ніж US-ASCII, функція stringToAsciiByteArrayбуде кидати в таких випадках, замість того, щоб розділити символ навпіл і взяти один або обидва байти.
Зверніть увагу, що ця відповідь нетривіальна, оскільки кодування символів є нетривіальним. Який тип байтового масиву ви хочете, залежить від того, яке кодування символів ви хочете, щоб ці байти представляли.
javascript має можливість внутрішнього використання або UTF-16, або UCS-2, але оскільки у нього є методи, які діють так, як це UTF-16, я не розумію, чому будь-який браузер буде використовувати UCS-2. Також дивіться: https://mathiasbynens.be/notes/javascript-encoding
Так, я знаю, що питанню 4 роки, але мені потрібна була сама відповідь.