Извлечение подстроки по позициям байтов utf-8

У меня есть строка, начало и длина, с которой нужно извлечь подстроку. Обе позиции (начало и длина) основаны на смещениях байтов в исходной строке 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, но количество байтов, занимаемых при кодировании, зависит от кодировки!!! Так что это не правильный способ сделать это.

9
задан Kaii 26 June 2012 в 21:42
поделиться