我有一个字符串,其中包含UTF-32(但可能更高的16bits始终为0)代码点。每个令牌是长字符串中每个字符的代码点的4个字节中的1个。请注意,在将字节转换为字符串之前,已将字节解释为带符号的整数,对此我无法控制。 // Provided: intEncodedBytesString= "0,0,0,-31,0,0,0,-15,0,0,0,-31"; //3 chars: áñá // Wanted actualCodePoints = [225,241,225];我需要将intEncodedBytesString转换为actualCodePoints数组。到目前为止,我想到了这个:var intEncodedBytesStringArray = intEncodedBytesString.toString().split(',');var i, str = '';var charAmount = intEncodedBytesStringArray.length / 4;for (i = 0; i < charAmount; i++) { var codePoint = 0; for (var j = 0; j < 4; j++) { var num = parseInt(intEncodedBytesStringArray[i * 4 + j], 10); if (num != 0) { if (num < 0) { num = (1 << (8 * (4 - j))) + num; } codePoint += (num << (8 * (3 - j))); } } str += String.fromCodePoint(codePoint);}有没有更好,更简单和/或更有效的方法?我已经看到许多答案和代码段来处理类似的问题,但没有解决我的输入字节位于带符号的ints字符串中的问题:S编辑:此代码将无法与最高代码点一起使用,因为1 最佳答案 因为它是很好的简单UTF-32,所以是一种更简单的方法:只需在四个字节的块中工作。同样,处理可能的负值的简单方法是(value + 256) % 256。所以:var intEncodedBytesString = "0,0,0,-31,0,0,0,-15,0,0,0,-31"; //3 charvar actualCodePoints = [];var bytes = intEncodedBytesString.split(",").map(Number);for (var i = 0; i < bytes.length; i += 4) { actualCodePoints.push( (((bytes[i] + 256) % 256) << 24) + (((bytes[i + 1] + 256) % 256) << 16) + (((bytes[i + 2] + 256) % 256) << 8) + (bytes[i + 3] + 256) % 256 );}带有注释的详细说明的示例:// Starting pointvar intEncodedBytesString = "0,0,0,-31,0,0,0,-15,0,0,0,-31"; //3 char// Target arrayvar actualCodePoints = [];// Get the bytes as numbers by splitting on comman running the array// through Number to convert to number.var bytes = intEncodedBytesString.split(",").map(Number);// Loop through the bytes building code pointsvar i, cp;for (i = 0; i < bytes.length; i += 4) { // (x + 256) % 256 will handle turning (for instance) -31 into 224 // We shift the value for the first byte left 24 bits, the next byte 16 bits, // the next 8 bits, and don't shift the last one at all. Adding them all // together gives us the code point, which we push into the array. cp = (((bytes[i] + 256) % 256) << 24) + (((bytes[i + 1] + 256) % 256) << 16) + (((bytes[i + 2] + 256) % 256) << 8) + (bytes[i + 3] + 256) % 256; actualCodePoints.push(cp);}// Show the resultconsole.log(actualCodePoints);// If the JavaScript engine supports it, show the stringif (String.fromCodePoint) { // ES2015+ var str = String.fromCodePoint.apply(String, actualCodePoints); // The above could be // `let str = String.fromCodePoint(...actualCodePoints);` // on an ES2015+ engine console.log(str);} else { console.log("(Your browser doesn't support String.fromCodePoint)");}关于javascript - JavaScript:如何将多字节字符串数组转换为32bits int数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39428860/
10-12 12:27
查看更多