灵感来自@ 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) // char > 1 byte since charCodeAt returns the UTF-16 value
{
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 = [];
//currently the function returns without BOM. Uncomment the next line to change that.
//bytes.push(254, 255); //Big Endian Byte Order Marks
for (var i = 0; i < str.length; ++i)
{
var charCode = str.charCodeAt(i);
//char > 2 bytes is impossible since charCodeAt can only return 2 bytes
bytes.push((charCode & 0xFF00) >>> 8); //high byte (might be 0)
bytes.push(charCode & 0xFF); //low byte
}
return bytes;
}
function stringToUtf32ByteArray(str)
{
var bytes = [];
//currently the function returns without BOM. Uncomment the next line to change that.
//bytes.push(0, 0, 254, 255); //Big Endian Byte Order Marks
for (var i = 0; i < str.length; i+=2)
{
var charPoint = str.codePointAt(i);
//char > 4 bytes is impossible since codePointAt can only return 4 bytes
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(和谐)提案的一部分。由于charCodeAt返回2个字节,这些字符比US-ASCII可能表示的字符多,所以函数stringToAsciiByteArray
将引发这种情况,而不是将字符分成两半,并取其中一个或两个字节。
请注意,这个答案是不平凡的,因为字符编码是不平凡的。你想要什么样的字节数组取决于你想要这些字节代表什么字符编码。
javascript有内部使用UTF-16或UCS-2的选项,但由于它具有像UTF-16一样的方法,所以我不明白为什么任何浏览器都会使用UCS-2。 另请参阅:https://mathiasbynens.be/notes/javascript-encoding
是的我知道问题是4岁,但我需要这个答案为我自己。
的JavaScript是不完全的最知名的易于使用的BLOB使用 - 你为什么不只是发送字符串的JSON? – 2011-06-03 10:58:31
Javascript字符串是UTF-16,还是您已经知道了? – Kevin 2011-06-03 11:02:49
首先为什么你需要在JavaScript中转换此? – BreakHead 2011-06-03 11:07:06