2016-01-19 1 views
2

Если у меня есть строка, которую нужно искать в UTF-8, а другая для поиска, также в UTF-8, есть ли какие-либо оговорки, чтобы выполнить прямой поиск по сравнению с кодовым пунктом, чтобы определить подходящий символ?Любые оговорки при поиске кодовой точки UTF-8 в строке?

С тем, как работает UTF-8, можно ли когда-либо получить ложный позитив?

Я прочитал много документации о том, как велика UTF-8, но у меня возникли проблемы с созданием доказательства для ответа на этот вопрос.

Если я ищу вперёд, то я могу пропустить длину кода; но он идет по веревке, которая меня беспокоит.

Вместо того, чтобы идти назад, пока не нажмете начало кода, а затем сделайте сравнение памяти с этого адреса, безопасно ли просто идти назад по каждому байту, пока я не получу полный матч против строки поиска?

ответ

4

Nope. Здесь нет никаких оговорок; эта операция совершенно безопасна в UTF-8.

Напомним, что в UTF-8 представляет символы с использованием двух общих форм:

  • ASCII символов (U + 0000 до U + 007F), которые все представленные в буквальном смысле с помощью одного байта в диапазоне 0x00-0x7F.

  • Все остальные символы, которые представлены в последовательности, которая включает в себя:

    • ведущий байт, в диапазоне 0xC2-0xF4, который кодирует часть символьных данных, а также от длины последовательности следить.
    • Один или несколько байт продолжения в диапазоне 0x80-0xBF, который кодирует часть остальной части символа.

Поскольку не существует никакого дублирования между ведущими и продолжением байтами, случайным запуском поиска в середине многобайтового характера в порядке. Вы не найдете свой матч, потому что строка, которую вы ищете, не будет начинаться с байта продолжения, но вы также не найдете никаких ложных срабатываний.

+0

Имейте в виду, что UTF кодируют только коды. Если вы хотите сделать * кодовый поиск *, вы в порядке. Но если вы хотите выполнить * текстовый поиск *, вы должны учитывать нормализацию, поскольку различные кодовые точки имеют разные представления в разных нормализованных формах.Поэтому вам нужно убедиться, что две строки UTF-8 используют одну и ту же нормализованную форму. –

0

На самом деле можно вывести размер байта кодовой точки с первого байта, чтобы вы могли пропустить вперед в прямом направлении. Однако ваш подход с прямым подбором шаблонов также должен работать нормально, поскольку байты продолжения побитовые отличаются от начальных байтов кодовой точки.

Смотрите здесь для битовых шаблонов: https://en.wikipedia.org/wiki/UTF-8#Description

Кроме того, поскольку продолжение байты побитовых отличия от начального байта каждой точки коды «идти назад», чтобы найти исходный код точка байт легко , Однако у вас также не должно быть проблем с вашей предлагаемой схемой обратного сопоставления.

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