Unicode-строки в .Net с еврейскими буквами и цифрами - PullRequest
7 голосов
/ 06 июля 2011

При попытке создать строку, содержащую букву иврит и цифру, происходит странное поведение.Цифра всегда будет отображаться слева от буквы.Например:

string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;
textBlock1.Text = AB;
//Ouput bug - B is left to A.

Эта ошибка возникает только при использовании букв и цифр иврита.При пропуске одного из них в уравнении ошибка не произойдет:

string A = "\u20AA"; //Some random Unicode.
string B = "23";
string AB = A + B;
textBlock1.Text = AB;
//Output OK.

string A = "\u05E9"; //A Hebrew letter.
string B = "HELLO";
string AB = A + B;
textBlock1.Text = AB;
//Output OK.

Я попытался поиграть со свойством FlowDirection, но это не помогло.

Обходное решение для отображения текстаправильно в первом коде будет приветствоваться exmaple.

Ответы [ 4 ]

13 голосов
/ 06 сентября 2012

Юникод-символы "RTL mark" (U + 200F) и "LTR mark" (U + 200E) были созданы именно для этой цели.

В вашем примере просто поместите знак LTR после ивритского символа, и цифры будут отображаться справа от ивритского символа, как вы пожелаете.

Таким образом, ваш код будет скорректирован следующим образом:

string A = "\u05E9"; //A Hebrew letter
string LTRMark = "\u200E"; 
string B = "23";
string AB = A + LTRMark + B;
4 голосов
/ 06 июля 2011

Это из-за двунаправленных алгоритмов Unicode .Если я правильно понимаю, у символа юникода есть «идентификатор», который говорит, где он должен быть, когда он находится рядом с другим словом.

В этом случае \u05E9 говорит, что он должен быть слева.Даже если вы сделаете:

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

Вы все равно получите его слева.Однако, если вы возьмете другой кодированный символ, такой как \u05D9, он будет добавлен справа, потому что этот символ не указан слева.

Это расположение языка, и при выводе этогоlayout enginge выведет его в соответствии с языковым макетом.

0 голосов
/ 06 июля 2011
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 голосов
/ 06 июля 2011

У этого странного поведения есть объяснение. Цифры с символами Unicode рассматриваются как часть строки Unicode. и, поскольку ивритский язык читается справа налево, сценарий даст

string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;

B идет первым, затем следует A.

второй сценарий:

string A = "\u20AA"; //Some random Unicode.
string B = "23";
string AB = A + B;

A - это какой-то юникод, не является частью языка, который читается справа налево . поэтому вывод - сначала A, а затем B.

теперь рассмотрим мой собственный сценарий

string A = "\u05E9";
string B = "\u05EA";
string AB = A + B;

и A, и B являются частью права чтения слева направо, поэтому AB - это B, за которым следует A. не A, за которым следует B.

отредактировано, чтобы ответить на комментарий

с учетом этого сценария -

string A = "\u05E9"; //A Hebrew letter
string B = "23";
string AB = A + B;

Единственное решение, чтобы получить букву, за которой следуют цифры, это: string AB = B + A;

, а не решение, которое будет работать в целом. Итак, я думаю, вам нужно реализовать некоторые условия проверки и построить строку в соответствии с требованиями.

...