【发布时间】:2017-01-18 14:59:54
【问题描述】:
我有一个包含 UTF-32(但可能较高的 16 位始终为 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);
}
有没有更好、更简单和/或更有效的方法?
我已经看到了几十个答案和代码片段来处理类似的事情,但没有解决我的输入字节在一个有符号整数字符串中的问题:S
编辑:此代码不适用于最高代码点,因为 1
【问题讨论】:
-
@T.J.Crowder 确实,UTF-32。编辑添加。
标签: javascript character-encoding utf