9

ヘブライ文字と数字を含む文字列を作成しようとすると、奇妙な動作が発生します。数字は常に文字の左側に表示されます。例えば:

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

このバグは、ヘブライ文字と数字の両方を使用している場合にのみ発生します。方程式からそれらの1つを省略すると、バグは発生しません。

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プロパティで遊んでみましたが、役に立ちませんでした。

最初のコード例でテキストを正しく表示するための回避策を歓迎します。

4

4 に答える 4

15

Unicode文字「RTLマーク」(U + 200F)および「LTRマーク」(U + 200E)は、この目的のために正確に作成されました。

あなたの例では、ヘブライ文字の後にLTRマークを付けるだけで、必要に応じてヘブライ文字の右側に数字が表示されます。

したがって、コードは次のように調整されます。

string A = "\u05E9"; //A Hebrew letter
string LTRMark = "\u200E"; 
string B = "23";
string AB = A + LTRMark + B;
于 2012-09-06T19:13:25.773 に答える
4

これは、Unicode双方向アルゴリズムによるものです。これを正しく理解していれば、Unicode文字には、別の単語の隣にあるときにどこにあるべきかを示す「識別子」があります。

この場合\u05E9、それは左側にあるべきだと言っています。あなたがそうしても:

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

あなたはまだそれを左に得るでしょう。ただし、\u05D9このような別のユニコード文字を取得すると、その文字は左側にあるとは言われないため、右側に追加されます。

これは言語のレイアウトであり、これを出力すると、レイアウトエンジンは言語レイアウトに従って出力します。

于 2011-07-06T10:46:24.607 に答える
0

その奇妙な行動には説明があります。Unicode文字を含む数字は、Unicode文字列の一部として扱われます。ヘブライ語の言語を右から左に読むと、シナリオは次のようになります。

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

B最初に来て、次にA

2番目のシナリオ:

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

Aはユニコードであり、右から左に読み取られるlangの一部ではありません。したがって、出力は-最初に-Aが続きBます。

今、私自身のシナリオを考えてみましょう

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

Aとは両方ともB右から左への読み取り言語の一部であるため、その後に。ABB続きAます。Aが続かないB

編集済み、コメントに答える

このシナリオを考慮に入れる-

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

文字の後に数字を付ける唯一の解決策は次のとおりです。string AB = B + A;

一般的に機能するソリューションではありません。したがって、いくつかのチェック条件を実装し、要件に従って文字列を作成する必要があると思います。

于 2011-07-06T11:16:08.670 に答える
0
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.
于 2011-07-06T12:50:10.577 に答える