Конкатенация строк, содержащая арабские и западные символы - PullRequest
27 голосов
/ 30 мая 2011

Я пытаюсь объединить несколько строк, содержащих как арабские, так и западные символы (смешанные в одной строке). Проблема в том, что результатом является строка, которая, скорее всего, семантически верна, но отличается от того, что я хочу получить, потому что порядок символов изменяется двунаправленным алгоритмом Unicode. По сути, я просто хочу объединить, как если бы они все были LTR, игнорируя тот факт, что некоторые из них являются RTL, своего рода «агностическая» конкатенация.

Я не уверен, был ли я ясен в своем объяснении, но я не думаю, что смогу сделать это лучше.

Надеюсь, кто-нибудь может мне помочь.

С уважением,

Карлос Феррейра

Кстати, строки извлекаются из базы данных.

EDIT

enter image description here

Первые 2 строки - это строки, которые я хочу объединить, а третья - результат.

РЕДАКТИРОВАТЬ 2

На самом деле, сцепленная строка немного отличается от изображенной на изображении, она была изменена во время копирования + вставки, 1 - после первого A, а не непосредственно перед вторым A.

Ответы [ 3 ]

44 голосов
/ 06 июня 2011

Вы можете встраивать регионы двунаправленного текста, используя кодовые точки управления форматом Unicode:

  • Вложение слева направо (U + 202A)
  • Вложение справа налево (U + 202B)
  • Направленное форматирование (U + 202C)

Так что в java, чтобы встроить язык RTL, например, арабский, в язык LTR, например, английский, вы должны сделать

myEnglishString + "\u202B" + myArabicString + "\u202C" + moreEnglish

и сделать наоборот

myArabicString + "\u202A" + myEnglishString + "\u202C" + moreArabic

См. Общее двунаправленное форматирование для получения дополнительной информации или главу спецификации Unicode "Коды направленного форматирования" для исходного материала.

2 голосов
/ 31 мая 2011

Весьма вероятно, что вам нужно вставить коды направленного форматирования Unicode в вашу строку, чтобы правильно отобразить строку. Подробнее см. Коды направленного форматирования спецификации двунаправленного алгоритма Unicode.

Возможно, класс Bidi поможет вам определить правильную последовательность, поскольку он реализует двунаправленный алгоритм Unicode.

1 голос
/ 30 мая 2011

Это не меняет порядок кодов.Происходит то, что, когда дело доходит до отображения строки, она видит, что строка начинается со сценария справа налево, поэтому она отображает ее справа налево.

...