tiny-utf8: получение смещения в символах/кодовых точках

avatar
Vadim Berman
8 апреля 2018 в 10:14
345
1
3

Я использую tiny-utf8, который работает как замена std::string, но с возможностью перебора символов UTF-8. Все выглядит нормально, однако иногда мои строки проверяются в необработанном виде (char*) другими библиотеками (в моем случае это RE2). Другие библиотеки возвращают смещения подстрок. За исключением того, что смещения, которые они возвращают, относятся к необработанной строке, что означает, что они в байтах.

Мой вопрос: как преобразовать их в смещения кодовых точек/символов?

Я нашел метод, который позволяет сделать именно то, что мне нужно, за один вызов:

utf8_string str = "My UTF-8 string"; str.get_num_resulting_codepoints(0, offsetInBytes);

За исключением того, что он защищен. Я могу, конечно, обнародовать это, но должна быть причина, по которой это было скрыто; должен быть другой путь.

Я также рассматривал возможность использования метода raw_get, но не уверен, что это правильно:

str.raw_get(offsetInBytes) - str.begin()

Источник
smbear
8 апреля 2018 в 11:18
2

Я бы спросил автора библиотеки. Похоже, исходный репозиторий находится здесь. Более того, кажется, что в master больше нет метода get_num_resulting_codepoints().

Vadim Berman
8 апреля 2018 в 11:23
0

Ого, спасибо за наводку! Вероятно, сообщение на Stackoverflow также принесет пользу сообществу, поэтому я спрошу его здесь.

Ответы (1)

avatar
Jakob Riedle
9 апреля 2018 в 08:56
3

Метод get_num_resulting_codepoints был переименован в Версии 2 в get_num_codepoints и дополнительно стал закрытым. Я подготовил новый выпуск "2.0.2", который снова делает общедоступным get_num_codepoints (вместе с get_num_bytes и get_num_bytes и <215197>8782151>).

Вы можете использовать его так же, как и раньше. Однако решение с вычитанием итераторов немного более элегантно, поскольку оно делает то же самое и столь же эффективно. Я бы остановился на этом :)

Vadim Berman
9 апреля 2018 в 09:34
1

Спасибо, Якоб, и за библиотеку, и за ответ!