Ragel создает жесткий фрагмент исходного кода, который встроен в ваш любимый язык. Этот код не использует никаких библиотек, не предоставленных Ragel, ни языковой стандартной библиотеки. Таким образом, у него нет средств для разбора UTF-8 или вычисления длины строки UTF-8.
Что это такое может, однако, это дать вам указатели на часть интересующей вас строки. Учитывая это, вы можете рассчитать длину UTF-8, используя ваши любимые инструменты, специфичные для языка. Например, в C++ вы можете использовать метод cxxtools 'Utf8Codec::do_length (или любую другую библиотеку, о которой вы можете думать), чтобы получить длину UTF-8 в €€
после того, как код Ragel вернет ее вам.
Вы также можете настроить Ragel на использование 16-битных символов и подать UCS-2 на него, as discussed by Wil Macaulay and Wincent Colaiuta. 32-битные символы с UCS-4 должны быть еще лучше.
Еще одним углом может быть создание конечного автомата, передающего UTF-8 с использованием сценария unicode2ragel.rb, и попытка его изменения для подсчета количества переходов. (Я понятия не имею, будет ли это работать или нет, никогда не использовал этот автомат).
Есть одна вещь, которую я не понимаю. Мой вопрос выше, поскольку он написан теперь как неявное предположение (извините за это!), Что у меня уже есть машина, которая соответствовала некоторым шаблонам, которые меня интересуют. Как мне объединить мою машину с машиной для соответствия UTF-8, akin к чему «unicode2ragel.rb» делает? Должен ли я подсчитывать коды как в каждом из правил машины, так и в каждом правиле UTF-8? –
Поскольку я никогда не работал с 'unicode2ragel.rb', я бы рекомендовал создать новый, более конкретный вопрос о stackoverflow для кого-то другого, чтобы ответить. Что-то похожее на то, чтобы привести пример того, как включить машину 'unicode2ragel.rb' в существующую и как использовать ее для подсчета кодовых точек. – ArtemGr