В Xcode, как отображать текст, объединяющий английский + арабский и начинающийся с арабского?

Я хочу установить метку в строку: "خخخ только что купил:" Набор маскировки ". но когда я запускаю тест, на этикетке отображается "просто купленный: набор маскировки"?

Если текст не начинается с арабского, он будет отображаться как то, что я установил. В чем проблема?

Кто-нибудь знает, как справиться с этой проблемой?

Ответ 1

Сначала прочитайте Cal Henderson отлично "Понимание двунаправленного (BIDI) текста в Юникоде." .

Верьте или нет, UILabel закладывает это так, как вы просили. Вы предоставили строку справа налево (начиная с арабского). Он начинает показывать это справа налево. Затем вы вложили строку слева направо, которую она откладывает слева направо. Затем он видит период и устанавливает это справа налево, так как это арабская строка, которая просто имеет в ней какой-то английский (как может лучше сказать UILabel).

То, что вы имели в виду, это строка слева направо с встроенным арабским. Это означает, что вам нужно запустить строку с символами слева направо. Два варианта: добавьте немного английского языка в начало или используйте знак "слева направо" нулевой ширины (U + 200E, LRM), чтобы привязать начало строки в режим LTR.

Objective-C:

self.label.text = @"\u200eكتب just bought: Disguise Kit.";

Swift:

self.label.text = "\u{200E}كتب just bought: Disguise Kit."

Хорошей новостью о U + 200E является то, что вы можете безопасно добавить ее в каждую строку LTR перед ее отображением. Вы даже можете безопасно разместить его в начале локализованных строк для языков LTR. Если он избыточен, это ничего не повредит.

Несколько других замечаний: никогда не проверяйте этот материал с помощью ككك, всегда проверяйте с помощью كتب (как и каждый хороший ученик: D) или еще лучше, но что-то вроде الو. В противном случае вы не можете сказать, когда арабский язык выложен назад. Мне нравится الو, потому что он выглядит совершенно иначе.

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