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