У меня есть строка, начало и длина, с которой нужно извлечь подстроку. Обе позиции (начало и длина) основаны на смещениях байтов в исходной строке UTF8.
Однако есть проблема:
Начало и длина указаны в байтах, поэтому я не могу использовать "подстроку". Строка UTF8 содержит несколько многобайтовых символов. Есть ли гиперэффективный способ сделать это? (Мне не нужно декодировать байты...)
Пример: var orig = '你好吗?'
Для извлечения второго символа (好) s,e может быть равно 3,3. Я ищу
var result = orig.substringBytes(3,3);
Помощь!
Обновление №1В C/C++ я бы просто привел его к массиву байтов, но не уверен, что есть эквивалент в javascript. Кстати, да, мы могли бы разобрать его в массив байтов и разобрать обратно в строку, но кажется, что должен быть быстрый способ вырезать его в нужном месте. Представьте, что «orig» — это 1 000 000 символов, а 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, но количество байтов, занимаемых при кодировании, зависит от кодировки!!! Так что это не правильный способ сделать это.