Мне нужно написать функцию, которая будет переворачивать все символы строки слева направо.
например:
Thė quiçk ḇrown fox jumṕềᶁ ovểr thë lⱥzy ȡog.
должен стать
.goȡ yzⱥl ëht rểvo ᶁềṕmuj xof nworḇ kçiuq ėhT
я могу ограничить вопрос UTF-16 (который имеет те же проблемы, что и UTF-8, только реже).
Наивное решение может попытаться перевернуть все вещи (например, слово за слово, где слово - это 16 бит - я бы сказал байт за байт, если бы мы могли предположить, что байт - это 16 бит. Я мог бы также сказать character-for-character, где character - это тип данных 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
˛
and flipping each "code point" gives:
˛
t
i
n
ę
˘
r
ế
ḟ
˜
f
ỉ
ɗ
Что не только не является правильной кодировкой UTF-16, но и не является одинаковыми символами.
Проблема возникает в кодировке UTF-16, когда есть:
Те же проблемы возникают в кодировке UTF-8, с дополнительным случаем
Я могу ограничиться более простой кодировкой UTF-16 (поскольку именно эту кодировку имеет язык, который я использую (например, C#, Delphi)
Проблема, как мне кажется, заключается в том, чтобы определить, является ли ряд последующих кодовых точек объединяющими символами, которые должны идти вместе с базовым глифом.
Забавно наблюдать, как онлайновый сайт реверсирования текста не принимает это во внимание.
Примечание:
- любое решение должно предполагать, что у меня нет доступа к библиотеке кодировки UTF-32 (в основном потому, что у меня нет доступа ни к одной библиотеке кодировки UTF-32)
- доступ к библиотеке кодировки UTF-32 решил бы проблему языковых плоскостей UTF-8/UTF-16, но не проблему сочетания диакритических знаков