2010-02-02 15 views
17

Essayer d'afficher une chaîne qui commence par hebrew un numéro, affiche toujours le numéro à la fin de la chaîne comme ceci: 1. יום שישי בבוקרRTL montre chiffres à la fin des lignes

mais je besoin du numéro à afficher sur le côté droit du texte

une solution à cela?

Il arrive avec UILabel & UITextField & UITextView

et essayer d'écrire le numéro sur le côté gauche produisent également le même avant-corps. Jouer avec des combinaisons de UITextAlignment n'aidera pas.

+0

Voir http://stackoverflow.com/questions/1553248/iphone-and-right-to-left-text. Malheureusement, pas de réponses jusqu'à présent. – kennytm

+0

Merci mais ce n'est pas la même isuue. – Tiger

+0

Whoa, comme c'est étrange! Que se passe-t-il si vous avez un numéro au milieu de l'hébreu, ou au début de la chaîne mais après un espace? – lawrence

Répondre

0

ne sais pas s'il y a colombophile façon de le faire, mais vous pourriez vouloir essayer quelque chose comme ceci:

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." 
+0

Merci beaucoup, mais ce n'est pas le problème. Il affichera mal, peu importe comment je vais essayer de le commander. Quelque chose avec l'affichage hébreu à l'écran. Par exemple: 1. יום שישי בבוקר Et: י .1 .יום שישי בבוקר Sera affiché de la même manière sur l'écran – Tiger

22

Vous ne devez modifier aucun réglage sur UILabel, il suffit de mettre le personnage avec unicode 0x200F avant votre chaîne. C'est la raison:

En Unicode, de nombreux caractères ont une directionnalité spécifique, ce qui permet au système de savoir qu'il doit être écrit, disons LTR, comme سلام. Le paragraphe utilise généralement la direction de son premier caractère. C'est pourquoi votre chaîne sans le numéro est automatiquement tapée de droite à gauche.

Maintenant, certains caractères, comme les nombres, ont une directivité "faible", donc ils prennent essentiellement celui de leur environnement. Lorsque vous tapez "1. קוקר", le système voit d'abord 1, donc prend la direction habituelle de LTR. Changer l'alignement n'aidera pas, car il déplace tout le texte vers la droite, ou le centre.

Pour résoudre ce problème, Unicode a deux caractères de marqueur (LTR: 0x200E, RTL: 200F). Ceux-ci sont invisibles, mais dictent la directionnalité. Ainsi, alors que "1. בבוקר" est ...

  1. בבוקר

si vous tapez "# x200F" + "1. בבוקר", il affiche comme ceci:

1. בבוקר

+0

Peut-on mélanger RTL & LTR dans un UITextView? Il semble que seul le premier caractère marqueur (LTR ou RTL) est analysé, donc je ne suis pas capable d'afficher un texte écrit bidirectionnel (une ligne dans LTR, la deuxième ligne dans RTL, et les alarmes dans LTR à nouveau) – konradowy

+0

merci vous, cela a résolu mon problème, mais où avez-vous obtenu cette information, j'ai beaucoup cherché jusqu'à ce que j'ai trouvé votre poste. – DeyaEldeen

+0

Merci, cela m'a vraiment aidé à résoudre un bug que j'ai passé trop longtemps. Je peux maintenant fermer plus de 20 onglets ;-) – adnan

15

bâtiment sur une grande réponse Mo:

Ce code Obj-C:

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

et il fonctionne en fait ...

+0

L'insertion de ce code en début de chaîne n'a pas fonctionné pour moi. –

6

J'ai eu un problème un peu différent, mais la réponse de Mo m'a donné l'indice.

Je voulais obtenir un texte LTR (comme "abcd") affiché dans la direction RTL ("dcba") sans avoir à faire moi-même l'inversion de chaîne. Il se avère enfermant la chaîne entre \u202E et \u202C fait l'affaire.

Je recommande également la lecture de la page suivante, car il donne une très bonne explication de tous ces magie unicode:

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

+0

Cela a fonctionné parfaitement –

5

personne Swift?

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

    func stringByForcingWritingDirectionRTL() -> String { 
     return "\u{200F}".stringByAppendingString(self) 
    } 
} 
+0

cette solution n'a pas fonctionné – JAHelia