7

C#でStringBuilderを使用して、英語(左から右)またはアラビア語(右から左)のテキストを追加しています。

stringBuilder.Append("(");
stringBuilder.Append(text);
stringBuilder.Append(") ");
stringBuilder.Append(text);

text = "A"の場合、出力は "(A)A"です。

ただし、text = "بتث"の場合、出力は "(بتث)بتث"になります。

何か案は?

4

3 に答える 3

9

これは、アラビア語またはヘブライ語の右から左へのテキストをレンダリングするように求められた場合のWindowsテキストレンダリングエンジンのよく知られた欠陥です。解決するのは難しい問題があります。その言語で利用できる適切な代替単語がない場合、人々はしばしば西洋の単語や句読点にフォールバックします。たとえば、ブランド名と会社名。レンダラーは、コードポイントを調べて適切なレンダリング順序を推測しようとします。ラテン文字セットの文字は、左から右にレンダリングする必要があります。

しかし、それは句読点で失敗し、括弧が最も目立ちます。何をすべきかがわかるように、明示的にする必要があります。Unicodeの右から左へのマークを使用するU+200F\u200f、C#コードで使用する必要があります。逆に、LTRレンダリングが必要であることがわかっている場合は、左から右へのマークを使用しますU+200E

于 2013-01-24T16:53:21.777 に答える
1

AppendFormat代わりに使用するAppend

stringBuilder.AppendFormat("({0}) {0}", text)

これで問題解決する場合がありますが、値を確認する必要がある場合がありますtext。おそらく、LTR/RTLマーカー文字が埋め込まれています。これらは、値で削除または修正する必要があります。

于 2013-01-24T14:32:30.017 に答える
0

同様の問題があり、Unicodeで各文字をチェックする関数を作成することで問題を解決できました。FEページからの場合は、以下に示すように、その後に202Cを追加します。これがないと、RTLとLTFが必要なものに混合されます。

string us = string.Format("\uFE9E\u202C\uFE98\u202C\uFEB8\u202C\uFEC6\u202C\uFEEB\u202C\u0020\u0660\u0662\u0664\u0668 Aa1");
于 2017-09-13T09:56:07.217 に答える