LINUX.ORG.RU

История изменений

Исправление LightDiver, (текущая версия) :

Да делал я циклом. Так дольше и длиннее. Сейчас попробую циклом и сравню. Я вчера целый день этим занимался.

Ты про что то такое?

function utf8myLen(s)
    local count = 0
    local i = 1
    while i <= #s do
        local byte = string.byte(s, i)
        -- Проверяем первый байт символа:
        if byte < 128 then
            -- ASCII символ (один байт)
            count = count + 1
            i = i + 1
        elseif byte >= 194 and byte <= 244 then
            -- Многосимвольный UTF-8 символ
            -- Определяем длину символа по первому байту
            local len
            if byte <= 223 then
                len = 2
            elseif byte <= 239 then
                len = 3
            else
                len = 4
            end
            -- Увеличиваем счётчик символов
            count = count + 1
            -- Пропускаем все байты текущего символа
            i = i + len
        else
            -- Некорректный байт, пропускаем
            i = i + 1
        end
    end
    return count
end
[22:37]Прошло: 0.0010000001639128
[22:38]Прошло: 1.160000000149
[22:41]Прошло: 2.7669999999925

Первое: #строка Второе: моя функцию на регулярках Третье: на циклах

Исправление LightDiver, :

Да делал я циклом. Так дольше и длиннее. Сейчас попробую циклом и сравню. Я вчера целый день этим занимался.

Ты про что то такое?

function utf8myLen(s)
    local count = 0
    local i = 1
    while i <= #s do
        local byte = string.byte(s, i)
        -- Проверяем первый байт символа:
        if byte < 128 then
            -- ASCII символ (один байт)
            count = count + 1
            i = i + 1
        elseif byte >= 194 and byte <= 244 then
            -- Многосимвольный UTF-8 символ
            -- Определяем длину символа по первому байту
            local len
            if byte <= 223 then
                len = 2
            elseif byte <= 239 then
                len = 3
            else
                len = 4
            end
            -- Увеличиваем счётчик символов
            count = count + 1
            -- Пропускаем все байты текущего символа
            i = i + len
        else
            -- Некорректный байт, пропускаем
            i = i + 1
        end
    end
    return count
end

Исходная версия LightDiver, :

Да делал я циклом. Так дольше и длиннее. Сейчас попробую циклом и сравню. Я вчера целый день этим занимался.