@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이면 앞에 0이 3 개 있음을 의미합니다. 그러나 UTF-16에 대한 동일한 코드는 0으로 시작됩니다. 반면에 US-ASCII는 고정 너비 8 비트이므로 바이트로 직접 변환 할 수 있습니다.
String.prototype.charCodeAt최대 2 바이트를 반환하고 UTF-16과 정확히 일치합니다. 그러나 String.prototype.codePointAtECMAScript 6 (Harmony) 제안의 일부인 UTF-32 가 필요합니다. charCodeAt은 US-ASCII가 나타낼 수있는 것보다 더 많은 가능한 문자 인 2 바이트를 반환하기 때문에 stringToAsciiByteArray이러한 경우에는 문자를 반으로 나누고 하나 또는 두 바이트를 모두 취하는 대신 함수 가 throw됩니다.
문자 인코딩이 중요하지 않기 때문에이 대답은 중요하지 않습니다. 원하는 바이트 배열의 종류는 해당 바이트를 나타내는 문자 인코딩에 따라 다릅니다.
javascript에는 내부적으로 UTF-16 또는 UCS-2를 사용하는 옵션이 있지만 UTF-16처럼 작동하는 메서드가 있기 때문에 모든 브라우저가 UCS-2를 사용하는 이유를 알 수 없습니다. 참조 : https://mathiasbynens.be/notes/javascript-encoding
예, 질문이 4 년이라는 것을 알고 있지만이 답변이 필요했습니다.