Как перевернуть текст по горизонтали?

Мне нужно написать функцию, которая будет переворачивать все символы строки слева направо.

например:

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, с дополнительным случаем

  • любой символ за пределами 0.... 127 ASCII

Я могу ограничиться более простой кодировкой UTF-16 (поскольку именно эту кодировку имеет язык, который я использую (например, C#, Delphi)

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

Забавно наблюдать, как онлайновый сайт реверсирования текста не принимает это во внимание.

Примечание:

  • любое решение должно предполагать, что у меня нет доступа к библиотеке кодировки UTF-32 (в основном потому, что у меня нет доступа ни к одной библиотеке кодировки UTF-32)
  • доступ к библиотеке кодировки UTF-32 решил бы проблему языковых плоскостей UTF-8/UTF-16, но не проблему сочетания диакритических знаков

5
задан Community 23 May 2017 в 11:59
поделиться