靈感來自@ 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