7

アラビア語などのRTL言語の文字列に、英語が含まれているとします。

string s = "Test:لطيفة;اليوم;a;b"

文字列にセミコロンがあることに注意してください。のようにSplitコマンドを使用するとstring[] spl = s.Split(';');、一部の文字列が逆の順序で保存されます。これが起こることです:

spl [0] = "Test:لطيفة"
spl [1]=""اليوم
spl[2]= "a"
spl [3] = "b"

上記はオリジナルと比較して故障しています。代わりに、私はこれを取得することを期待しています:

spl [0] = "Test:اليوم"
spl [1]="لطيفة"
spl[2] = "a"
spl [3] = "b"

独自の分割関数を作成する準備ができています。ただし、文字列内の文字も逆の順序で解析されるため、正方形に戻ります。画面に表示されている各キャラクターを見ていきたいと思います。

4

4 に答える 4

13

あなたの文字列が現在立っているので、単語لطيفةは単語اليومの前に保存されます。اليومが「最初」(つまり、さらに左側)に表示されるという事実は、テキストを表示する際のUnicode双方向アルゴリズムの(正しい)結果にすぎません。

つまり、( "Test:لطيفة;اليوم; a; b")で始まる文字列は、ユーザーが "Test:"、لطيفة、 ";"、اليوم、";a;の順に入力した結果です。 b」。したがって、C#が分割する方法は、実際には文字列が作成される方法を反映しています。2つの連続するアラビア語の単語は、表示時に1つの単位として扱われるため、作成方法が文字列の表示に反映されないだけです。

文字列でアラビア語の単語をセミコロンを挟んで左から右の順序で表示し、同じ順序で単語を保存する場合は、後に左から右のマーク(U + 200E)を付ける必要があります。セミコロン。これにより、各アラビア語の単語がそれ自体の単位として効果的に分割され、双方向アルゴリズムが各単語を個別に処理します。

たとえば、次のコードは、使用している文字列と同じ文字列で始まります(左から右へのマークが1つ追加されています)が、期待どおりに分割されます(つまり、 、spl [0] = "Test:اليوم"、およびspl [1] = "لطيفة"):

static void Main(string[] args) {
    string s = "Test:اليوم;\u200Eلطيفة;a;b";
    string[] spl = s.Split(';');
}
于 2012-10-01T22:29:07.287 に答える
2

MicrosoftのUniscribeライブラリを使用することもできます。ScriptItemizeメソッドは、文字クラスター、元の文字列の開始インデックス、およびRTLの順序を提供します。この情報を使用して、アラビア語のみを含む連続したクラスターを見つけることができます。';'に関してそれらを分割する 方向を逆にすると、必要なものが得られます。

于 2012-10-02T11:25:48.817 に答える
1

それらの文字列は逆にされませんが、実際には正しい順序で分割されます。RTL言語は、表示されるとRTLになりますが、メモリ内では英語と同じように「左から右」に保持されます。アラビア語のキーボードがインストールされていないので少し難しいですが、デモンストレーションを試みます。

あなたの文字列はs = "Arbi/Arbi, Alarbia"です。s [0]はA(アラビア語のA'in)、s[1]はRなど​​です。s [4]は/であり、s [9]は、です。したがって、分割すると、最初の部分でs [0:8]が得られ、2番目の部分でs [10:]が得られます。

これは、RTL文字列を処理する正しい方法です。逆にしたい場合は、自分で配列を逆にする必要があります。

RTLとLTRの切り替えは、最も苛立たしい作業の1つであることに注意してください。RTL文字列内の数字や英語の単語をどうするかを理解するのにどれくらいの時間を費やすかわかりません。あなたができる最善のことは、問題を完全に回避し、Excelに文字列をRTLとして表示させることです。

于 2012-09-27T22:07:14.567 に答える
0

Split(Reflectorによると)内部で使用Substringし、文化を考慮せずに文字を左から右にコピーするだけの内部関数を使用しているように見えます。Splitそのため、返される配列を逆にするだけではどうしようもありません。

于 2012-09-27T22:04:20.480 に答える