Недавно кто-то спросил о алгоритме для изменения строки в C. Большинство предложенных решений имели проблемы при работе с однобайтовыми строками. Итак, мне было интересно, что может быть хорошим алгоритмом для конкретного использования строк utf-8.
Я придумал какой-то код, который я отправляю в качестве ответа, но я был бы рад увидеть другие идеи или предложения других людей. Я предпочел использовать фактический код, поэтому я выбрал С#, поскольку он, кажется, является одним из самых популярных языков на этом сайте, но я не против, если ваш код на другом языке, если он может быть разумным понимаемый кем-либо, кто знаком с императивным языком. И поскольку это предназначено для того, чтобы увидеть, как такой алгоритм может быть реализован на низком уровне (по низкому уровню, я имею в виду только байты), идея состоит в том, чтобы избежать использования библиотек для основного кода.
Примечания:
Меня интересует сам алгоритм, его производительность и как его можно оптимизировать (я имею в виду оптимизацию на уровне алгоритма, не заменяя я ++ на ++ я и т.д., я тоже не очень заинтересован в реальных тестах).
Я не хочу на самом деле использовать его в производственном коде или "изобретать колесо". Это просто из любопытства и как упражнение.
Я использую массивы байтов на С#, поэтому я предполагаю, что вы можете получить длину строки, не запуская строку, пока не найдете NUL. То есть, я не учитываю сложность нахождения длины строки. Но, если вы используете C, например, вы можете определить это с помощью функции strlen() перед вызовом основного кода.
Edit:
Как указывает Майк Ф, мой код (и код других людей, размещенный здесь) не имеет отношения к составным символам. Некоторая информация о тех здесь. Я не знаком с этой концепцией, но если это означает, что существуют "комбинированные символы", то есть символы/кодовые точки, которые действительны только в сочетании с другими "базовыми" символами/кодовыми точками, смотровая таблица таких символы могут использоваться для сохранения порядка "глобального" символа ( "базовый" + "комбинирование" символов) при обращении.