แรงบันดาลใจจากคำตอบของ @ 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 นำหน้าเท่านั้นในทางกลับกัน 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 ปี แต่ฉันต้องการคำตอบนี้สำหรับตัวเอง