Мне нужно написать функцию, которая будет переворачивать все символы строки слева направо.
например:.
Быстрая лисица, играющая над собой.
должно стать
.goȡ yzⱥl ëht rểvo ᶁềṕmuj xof nworḇ kçiuq hhT
Я могу ограничить вопрос UTF-16 (который имеет те же проблемы, что и UTF-8, но реже).
Наивный раствор
Наивное решение может попытаться перевернуть все вещи (например, слово в слово, где слово 16-битное - я бы сказал байт для байта , если бы мы могли предположить, что байт был 16-битным. Я мог бы также сказать символ для символа где символ является типом данных Char
, который представляет собой одну кодовую точку):
String original = "ɗỉf̴ḟếr̆ęnͥt";
String flipped = "";
foreach (Char c in s)
{
flipped = c+fipped;
}
Результат неверно перевернутого текста:
ɗỉf̴ḟếr̆ęnͥt
̨tͥnę̆rếḟ̴fỉɗ
Это потому, что один «символ» занимает несколько «кодовых точек».
ɗỉf̴ḟếr̆ęnͥt
ɗ
ỉ
f
˜
ḟ
ế
r
˘
ę
n
i
t
˛
и переключение каждой «кодовой точки» дает:
˛
t
i
n
ę
˘
r
ế
ḟ
˜
f
ỉ
ɗ
Это не только недопустимая кодировка UTF-16, это не те же символы.
Отказ
Проблема возникает в кодировке UTF-16 при наличии:
Те же проблемы возникают в кодировке UTF-8, с дополнительным регистром
- любой символ вне диапазона 0.127 ASCII
я могу ограничиться более простой кодировкой UTF-16 (поскольку это кодировка, которую использует язык, который я использую (например, C #, Delphi)
Проблема, как мне кажется, заключается в обнаружении, если ряд последующих кодовых точек объединяет символы и должен сопровождаться базовым глифом.
Также интересно наблюдать за тем, как сайт онлайн-реверсирования текста не принимает это во внимание.
Примечание:
- любое решение должно предполагать, что не имеет доступа к библиотеке кодирования UTF-32 (в основном потому, что у меня нет доступа к какой-либо библиотеке кодирования UTF-32)
- доступ к библиотеке кодирования UTF-32 решит проблему языковых плоскостей UTF-8 / UTF-16, но не проблему объединяющих диакритических знаков