9
votes

Strings Unicode en .NET avec des lettres hébreu et des chiffres

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: xxx

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: xxx

J'ai essayé de jouer avec la propriété de flowdirection mais cela n'a pas aidé.

Une solution de contournement pour que le texte soit affiché correctement dans le premier code exmaple serait accueilli.


0 commentaires

4 Réponses :


4
votes

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.

Dans ce cas, \ u05e9 dit qu'il devrait être à gauche. Même si vous faites:

var ab = string.format ("{0} {1}", a, b);

Vous allez toujours l'obtenir à gauche. Toutefois, si vous prenez un autre caractère non codé tel que \ u05d9 ceci sera ajouté à droite car ce caractère n'est pas dit à gauche.

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.


5 commentaires

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 n'est pas physiquement "à gauche de A ". 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!



0
votes

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 xxx

b vient en premier, suivi de a . .

second scénario: xxx

a est un peu unicode, ne faisant pas partie de Lang qui est lu droit à gauche . Donc, la sortie est - premier A suivi de B .

considère maintenant mon propre scénario xxx Les deux A et B font partie de droite à gauche lecture LANG, donc AB est B suivi de A . pas a suivi de b .

édité, pour répondre au commentaire

prise en compte Ce scénario - xxx

La seule solution, pour obtenir une lettre suivie par chiffre, est la suivante: string ab = b + a; < 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.


5 commentaires

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"); laissera le contrôle savoir que la direction du texte est définie sur RTL (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;



0
votes
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.

0 commentaires

15
votes

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;


4 commentaires

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.