Il existe un comportement étrange lorsque vous essayez de créer une chaîne qui contient une lettre hébraïque et un chiffre. Le chiffre sera toujours affiché à gauche à la lettre. Par exemple: Ce bogue ne se produit que lorsque vous utilisez une lettre hébraïque et des chiffres. Lorsque vous omettez l'un de ceux de l'équation, le bug ne se produira pas: p> J'ai essayé de jouer avec la propriété de flowdirection mais cela n'a pas aidé. P> Une solution de contournement pour que le texte soit affiché correctement dans le premier code exmaple serait accueilli. P> p>
4 Réponses :
Ceci est dû à algorithmes bidirectionnels Unicode . Si je comprends bien cela correctement, le caractère Unicode a un "identifiant" qui dit là où il devrait être quand il est à côté d'un autre mot. P>
Dans ce cas, Vous allez toujours l'obtenir à gauche. Toutefois, si vous prenez un autre caractère non codé tel que Il s'agit de la mise en page de la langue et lors de la sortie de la configuration de la configuration de la configuration en fonction de la disposition de la langue. P> \ u05e9 code> dit qu'il devrait être à gauche. Même si vous faites: p>
var ab = string.format ("{0} {1}", a, b); code> p>
\ u05d9 code> ceci sera ajouté à droite car ce caractère n'est pas dit à gauche. P>
Intéressant, alors comment pouvez-vous expliquer que dans mon premier code exemple de code La lettre n'est pas à gauche, comme vous l'avez dit?
+1 Le B code> n'est pas physiquement "à gauche de
A code>". Ce n'est que la manière dont votre périphérique de sortie choisit de dessiner la séquence de caractères. À l'interne, tout est dans l'ordre, ou devrais-je dire סססר!
@Yaron Levi basé sur le scénario que vous avez mentionné, les chiffres seront traités comme une partie des caractères hébreu unicode. Donc, il sera toujours - juste à gauche. C'est-à-dire des chiffres d'abord (comme ils sont arrivés en dernier) suivi de la lettre Unicode.
@Kerrek SB Bien sûr, je comprends ce que vous dites. Mais "interne" ne m'aidera pas. J'ai besoin d'obtenir le résultat que je veux affiché dans un texte textuel.
@Yaron: Cela dépend entièrement de votre moteur de mise en page. Si cela applique l'algorithme bidirectionnel, il permettra de réorganiser les glyphes lors du rendu. Le processus est déterministe et si vous n'êtes pas sûr, vous pouvez lire l'algorithme précis - il est assez impliqué, imaginez mélanger l'hébreu, l'arabe, les chiffres, les chiffres, les numéros, les ... et ensuite, il existe des caractères explicites de remplacement invisible. . bonne chance!
Ce comportement étrange a une explication. Les chiffres avec des caractères unicodes sont traités comme une partie de la chaîne Unicode. Et comme l'hébreu Lang est lu droit à gauche, le scénario donnera second scénario: p> considère maintenant mon propre scénario p> prise en compte Ce scénario - p> La seule solution, pour obtenir une lettre suivie par chiffre, est la suivante: b code> vient en premier, suivi de
a code>. p>.
a code> est un peu unicode,
A code> suivi de
B code>. p>
A code> et
B code> font partie de droite à gauche lecture LANG, donc
AB code> est
B code> suivi de
A code>. pas
a code> suivi de
b code>. p>
string ab = b + a; code> p> < P> Prolly, pas une solution qui fonctionnera en général. Donc, je suppose que vous devez implémenter certaines conditions de contrôle et créer une chaîne en fonction des exigences. P> P>
Ok, alors y a-t-il un travail pour obtenir le résultat que je veux: afficher la chaîne dans l'ordre que je veux à l'intérieur d'un texte textuel?
J'ai déjà essayé cela mais ça ne marche pas. Le texte affiché dans le texte n'est toujours pas dans le bon ordre.
@Yaron Levi je suppose que c'est le projet ASP.NET, donc le code suivant du code textblock1.atributes.add ("dir", "rtl"); code> laissera le contrôle savoir que la direction du texte est définie sur
RTL code> (droit à gauche)
C'est un projet Silverlight. Il n'est pas hébergé dans quoi que ce soit. Tout se passe localement. J'ai changé la propriété Flowdirection dans XAML. Mais encore une fois, je ne pense vraiment pas que cela soit lié à notre problème. Je viens de le mentionner au cas où quelqu'un le suggère comme une solution possible.
@Yaron Levi je ne suis pas familier avec Silverlight. Quant à .net 3.5 Le code suivant a fait l'astuce string a = "\ u05e9"; // une chaîne de lettre hébraïque B = "23"; chaîne ab = b + a; Label1.attributes.add ("dir", "rtl"); Label1.text = AB; code>
string A = "\u05E9"; //A Hebrew letter string B = "23"; string AB = B + A; // ! textBlock1.Text = AB; textBlock1.FlowDirection = FlowDirection.RightToLeft; //Ouput Ok - A is left to B as intended.
Les caractères unicode "La marque RTL" (U + 200f) et "LTR Mark" (U + 200E) ont été créés précisément à cet effet.
Dans votre exemple, placez simplement une marque LTR après le caractère hébreu et Les chiffres seront ensuite affichés à droite du caractère hébreu, comme vous le souhaitez. p>
Donc, votre code serait ajusté comme suit: P>
string A = "\u05E9"; //A Hebrew letter string LTRMark = "\u200E"; string B = "23"; string AB = A + LTRMark + B;
Très bonne réponse. Savez-vous s'il existe un moyen de déterminer si une chaîne nécessite le LRTMARK lorsqu'il est annexé? J'aimerais toujours ajouter B à droite d'un, mais évidemment dans la plupart des locaux, ce sera la valeur par défaut, alors serait une étape gaspillée.
Avant d'ajouter le LTRKmark, vous souhaitez vérifier si le personnage avant le numéro est un caractère avec la directionnalité RTL. Il y a une bonne discussion, avec un certain nombre de solutions valides, ici: Stackoverflow.com/questions/4330951/...
Merci. Je viens d'ouvrir une prime de 50 points pour cette question. Je serais très reconnaissant si vous pouviez y jeter un coup d'œil: Stackoverflow.com/questions/12630566/...
Le problème avec cette solution est qu'il ajoute un nouveau caractère à la chaîne. Pour les scénarios où vous vous souciez d'un tableau de caractères de taille fixe, cela ne vous aidera pas, je suppose.