RTL показывает числа в конце строк - PullRequest
17 голосов
/ 02 февраля 2010

При попытке отобразить строку на иврите, которая начинается с цифры, всегда отображается число в конце строки, например: 1. יום םישי בבוקר

но мне нужно, чтобы номер отображался справа от текста-

есть ли какое-нибудь решение?

Это происходит с UILabel & UITextField & UITextView

и попытка написать число слева также приводит к тому же результату.

Игра с комбинациями UITextAlignment не поможет.

Ответы [ 5 ]

22 голосов
/ 29 мая 2010

Вам не нужно изменять какие-либо настройки в UILabel, просто поместите символ с юникодом 0x200F перед строкой. Это причина:

В Юникоде многие символы имеют определенную направленность, что позволяет системе знать, что она должна быть написана, скажем, LTR, например, سلام. Абзац обычно использует направление своего первого символа. Вот почему ваша строка без номера печатается справа налево автоматически.

Теперь некоторые символы, такие как цифры, имеют «слабую» направленность, поэтому они в основном воспринимают окружение. Когда вы набираете «1. בבוקר», система сначала видит 1, поэтому принимает обычное направление LTR. Изменение выравнивания не поможет, так как оно просто сдвигает весь текст вправо или по центру.

Чтобы решить эту проблему, в Юникоде есть два символа маркера (LTR: 0x200E, RTL: 200F). Они невидимы, но диктуют направленность. Так что пока "1. בבוקר" это ...

  1. בבוקר

если вы введете "# x200F" + "1. בבוקר", оно будет отображаться так:

1. בבוקר

15 голосов
/ 30 ноября 2010

Опираясь на великий ответ Мо:

Это код Obj-C:

NSString *RTFstr = "1. בבוקר"; //This could be any right-to-left string
NSString *directionalString = [@"\u200F" stringByAppendingString:[note text]];
[someUITextView setString:directionalString];

И это действительно работает ...

6 голосов
/ 31 января 2012

У меня была немного другая проблема, но ответ Мо дал мне подсказку.

Я хотел, чтобы текст LTR (например, "abcd") отображался в направлении RTL ("dcba") без необходимости перестановки строк. Оказывается, заключив строку между \u202E и \u202C, добьемся цели.

Я также рекомендую прочитать следующую страницу, поскольку она дает очень хорошее объяснение всей этой магии Юникода:

http://www.iamcal.com/understanding-bidirectional-text/

5 голосов
/ 20 апреля 2015

Свифт кто-нибудь?

extension String {
    func stringByForcingWritingDirectionLTR() -> String {
        return "\u{200E}".stringByAppendingString(self)
    }

    func stringByForcingWritingDirectionRTL() -> String {
        return "\u{200F}".stringByAppendingString(self)
    }
}
0 голосов
/ 08 февраля 2010

не уверен, есть ли более причудливый способ сделать это, но вы можете попробовать что-то вроде этого:

NSString *test = @"12. just a teststring";
NSString *number = [test substringToIndex: [test rangeOfString: @" "].location];
NSString *text = [test substringFromIndex: [test rangeOfString: @" "].location];
test = [NSString stringWithFormat: @"%@ %@", text, number];
// test == "just a teststring 12."
...