我有一个字符串和起始位置以及长度,需要从中提取一个子字符串。起始位置和长度都是基于原始UTF8字符串中的字节偏移量计算得到的。
但是,存在一个问题:
起始位置和长度都是按字节计算的,因此我无法使用 "substring" 方法。UTF8 字符串包含多个多字节字符。是否有一种超高效的方法来解决这个问题?(我不需要对字节进行解码...)
例如: var orig = '你好吗?'
如果 s 和 e 分别为 3 和 3,则提取第二个字符 好。我正在寻找
var result = orig.substringBytes(3,3);
求助!
更新#1在C/C++中,我会将其转换为字节数组,但不确定在JavaScript中是否有等价物。顺便说一句,我们可以将它解析成一个字节数组,然后再将其解析回一个字符串,但似乎应该有一种快速的方法来在正确的位置截断它。假设'orig'是1000000个字符,s = 6字节,l = 3字节。
更新#2感谢zerkms的帮助引导,我最终得到了以下结果,它对于多字节正常工作,但单字节却变得混乱。
function substrBytes(str, start, length)
{
var ch, startIx = 0, endIx = 0, re = '';
for (var i = 0; 0 < str.length; i++)
{
startIx = endIx++;
ch = str.charCodeAt(i);
do {
ch = ch >> 8; // a better way may exist to measure ch len
endIx++;
}
while (ch);
if (endIx > start + length)
{
return re;
}
else if (startIx >= start)
{
re += str[i];
}
}
}
更新 #3 我认为移动字符编码并不能真正解决问题。正确答案需要读取三个字节,而我始终会忘记这一点。在UTF8和UTF16中,代码点相同,但编码所占用的字节数取决于编码本身!因此,这不是解决问题的正确方法。
substr
的起始位置和长度是按字符而非字节计算的。 - nhahtdhBuffer()
。 - Kaii