Mảng byte UTF-16
JavaScript mã hóa các chuỗi dưới dạng UTF-16 , giống như C # UnicodeEncoding, do đó, các mảng byte phải khớp chính xác bằng cách sử dụng charCodeAt()và tách mỗi cặp byte trả về thành 2 byte riêng biệt, như trong:
function strToUtf16Bytes(str) {
const bytes = [];
for (ii = 0; ii < str.length; ii++) {
const code = str.charCodeAt(ii);
bytes.push(code & 255, code >> 8);
}
return bytes;
}
Ví dụ:
strToUtf16Bytes('🌵');
Tuy nhiên, nếu bạn muốn nhận một mảng UTF-8 byte, bạn phải chuyển mã các byte.
Mảng byte UTF-8
Giải pháp có vẻ hơi không tầm thường, nhưng tôi đã sử dụng mã bên dưới trong môi trường sản xuất có lưu lượng truy cập cao và thành công lớn ( nguồn gốc ).
Ngoài ra, đối với độc giả quan tâm, tôi đã xuất bản trình trợ giúp unicode của mình để giúp tôi làm việc với độ dài chuỗi được báo cáo bởi các ngôn ngữ khác như PHP.
export function strToUtf8Bytes(str) {
const utf8 = [];
for (let ii = 0; ii < str.length; ii++) {
let charCode = str.charCodeAt(ii);
if (charCode < 0x80) utf8.push(charCode);
else if (charCode < 0x800) {
utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));
} else if (charCode < 0xd800 || charCode >= 0xe000) {
utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
} else {
ii++;
charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(ii) & 0x3ff));
utf8.push(
0xf0 | (charCode >> 18),
0x80 | ((charCode >> 12) & 0x3f),
0x80 | ((charCode >> 6) & 0x3f),
0x80 | (charCode & 0x3f),
);
}
}
return utf8;
}