2015-01-14 3 views
0

Как можно получить символ позиция совпадающего образца в Ragel?UTF-8 позиция по умолчанию

Я знаю, что совпадение получает указатель на строку (char *), то есть смещение по байтам, где шаблон был найден внутри строки. Проблема в том, что UTF-8 является кодировкой переменной длины, и поэтому символы и байты не должны выравниваться.

Например, если я хотел искать $ в €€$ Я хотел бы получить 2, а 6 ($ → 0x24, → 0xE282AC).

ответ

1

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, и попытка его изменения для подсчета количества переходов. (Я понятия не имею, будет ли это работать или нет, никогда не использовал этот автомат).

+0

Есть одна вещь, которую я не понимаю. Мой вопрос выше, поскольку он написан теперь как неявное предположение (извините за это!), Что у меня уже есть машина, которая соответствовала некоторым шаблонам, которые меня интересуют. Как мне объединить мою машину с машиной для соответствия UTF-8, akin к чему «unicode2ragel.rb» делает? Должен ли я подсчитывать коды как в каждом из правил машины, так и в каждом правиле UTF-8? –

+0

Поскольку я никогда не работал с 'unicode2ragel.rb', я бы рекомендовал создать новый, более конкретный вопрос о stackoverflow для кого-то другого, чтобы ответить. Что-то похожее на то, чтобы привести пример того, как включить машину 'unicode2ragel.rb' в существующую и как использовать ее для подсчета кодовых точек. – ArtemGr

Смежные вопросы