カスタムバリデーターの1つがペルシア語の文字のみを受け入れるフォームに取り組んでいます。次のコードを使用しました。
var myregex = new Regex(@"^[\u0600-\u06FF]+$");
if (myregex.IsMatch(mytextBox.Text))
{
args.IsValid = true;
}
else
{
args.IsValid = false;
}
ただし、ペルシャ語のすべての文字をカバーしているわけではないため、アラビア語の文字しか検出できないようです(これらの4つが不足しています:گ、چ、پ、ژ)。
この問題を解決する方法はありますか?
文字には ^[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$
を使用するか、正規表現のフレーバーに関してコードポイントを使用します(すべてのエンジンが\uXXXX
表記をサポートしているわけではありません)。
^[\u0622\u0627\u0628\u067E\u062A-\u062C\u0686\u062D-\u0632\u0698\u0633-\u063A\u0641\u0642\u06A9\u06AF\u0644-\u0648\u06CC]+$
^[۰۱۲۳۴۵۶۷۸۹]+$
を使用するか、または正規表現のフレーバーを使用します。
^[\u06F0-\u06F9]+$
[ ٌ ًّ َ ِ ُ ْ ]
を母音に、または正規表現のフレーバーに関して使用します。
[\u202C\u064B\u064C\u064E-\u0652]
またはそれらの組み合わせ。 Hamza ء
などの他のアラビア文字を文字セットに追加することもできます。
[\u0600-\u06FF]
と[آ-ی]
の両方が間違っているのはなぜですか?\u0600-\u06FF
には以下が含まれますが:گ
とコードポイント06AF
چ
とコードポイント0686
پ
とコードポイント067E
ژ
とコードポイント0698
[\u0600-\u06FF]
または[آ-ی]
を示唆するすべての回答は単に間違っています。つまり、
\u0600-\u06FF
には 209 が必要以上の文字が含まれています!数字も入っています!
この答えは、一般的な誤解を修正するためにあります。コードポイント0600
から06FF
は、ペルシア語/ペルシア語のアルファベットを示しません([آ-ی]
も示しません):
[\u0600-\u0605 ؐ-ؚ\u061Cـ ۖ-\u06DD ۟-ۤ ۧ ۨ ۪-ۭ ً-ٕ ٟ ٖ-ٞ ٰ ، ؍ ٫ ٬ ؛ ؞ ؟ ۔ ٭ ٪ ؉ ؊ ؈ ؎ ؏
۞ ۩ ؆ ؇ ؋ ٠۰ ١۱ ٢۲ ٣۳ ٤۴ ٥۵ ٦۶ ٧۷ ٨۸ ٩۹ ءٴ۽ آ أ ٲ ٱ ؤ إ ٳ ئ ا ٵ ٮ ب ٻ پ ڀ
ة-ث ٹ ٺ ټ ٽ ٿ ج ڃ ڄ چ ڿ ڇ ح خ ځ ڂ څ د ذ ڈ-ڐ ۮ ر ز ڑ-ڙ ۯ س ش ښ-ڜ ۺ ص ض ڝ ڞ
ۻ ط ظ ڟ ع غ ڠ ۼ ف ڡ-ڦ ٯ ق ڧ ڨ ك ک-ڴ ػ ؼ ل ڵ-ڸ م۾ ن ں-ڽ ڹ ه ھ ہ-ۃ ۿ ەۀ وۥ ٶ
ۄ-ۇ ٷ ۈ-ۋ ۏ ى يۦ ٸ ی-ێ ې ۑ ؽ-ؿ ؠ ے ۓ \u061D]
255文字は アラビア語のブロック (0600–06FF)に分類されます。ペルシア語のアルファベットは32文字で、ペルシア語の数字のデモンストレーションに加えて42になります。母音(元々アラビア語の母音、ペルシア語)Tanvin(ً
、ٍِ
、ٌ
)およびTashdidなし(ّ
)どちらもペルシア語ではなくアラビア語の発音区別符号のサブセットであり、46文字になります。つまり、\u0600-\u06FF
には、必要以上の209文字が含まれています。
۷
とコードポイント06F7
はペルシア語で表現した7
であり、٧
とコードポイント0667
は同じ数字をアラビア語で表現したものです。 ۶
はペルシア語の6
の表記であり、٦
はアラビア数字の同じ番号の表記です。そして、すべてが0600
から06FF
コードポイントまで存在します。
ペルシア語の数字4(
۴
)、5(۵
)、および6(۶
)の形状は、アラビア語で使用される形状とは異なり、他の数字は異なるコードポイントを持っています。
ペルシア語やペルシャ語には存在しない他の文字もさまざまな数で表示され、名や姓を検証するときに誰もその文字を使用することはできません。
[آ-ی]
には117文字も含まれ、これは誰かが検証に必要なものをはるかに超えています。それらはすべてnicode CLDRを使用して表示できます。
あなたが現在あなたの正規表現に持っているものは 標準のアラビア語記号の範囲 です。追加の文字については、それらを個別に正規表現に追加する必要があります。ここにそれらのコードがあります:
ژ \u0698
پ \u067E
چ \u0686
گ \u06AF
だからすべてのあなたが持っているべきです
^[\u0600-\u06FF\u0698\u067E\u0686\u06AF]+$
受け入れられた回答( https://stackoverflow.com/a/22565376/790811 )に加えて、Zero-width_non-joiner(またはペルシア語ではنیمفاصله)文字も考慮する必要があります。残念ながら、2つのシンボルがあります。 1つは標準で、もう1つは標準ではありませんが広く使用されています。
したがって、finalregixは次のようになります。
^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F]+$
「space」を検討したい場合は、これを使用できます。
^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F ]+$
これでJavaScriptをテストできます:
/^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF7\u200C\u200F ]+$/.test('ایپسر تو چه میدانی؟')
注意:persianRexはJavaScriptで記述されていますが、ソースコードを使用して文字をコピーして貼り付けることができます。
ペルシャ語の文字の検出は、キーボードのレイアウトやオペレーティングシステムが多岐にわたるため、難しい作業です。以前にも同じ問題に直面し、この問題を修正するためにオープンソースライブラリを作成することにしました。
次のように問題を修正できます:persianRex.text.test(yourInput); // trueまたはfalseを返します
ここに完全なドキュメントがあります: http://imanmh.github.io/persianRex/
ペルシア語、ダリ語、タジク語は私のバイリウィックの外にありますが、Unicodeコードチャートを少し調べてみると、アラビア語が5つのUnicodeコードブロックをカバーしていることがわかります。
明示的なコードポイント範囲の代わりに 名前付きブロック を使用して、正規表現でそれら(少なくとも一部)を取得できます:\p{IsArabicPresentationForms-A}
は、上記のリストの4番目のUnicodeブロックを提供します。
Unicodeのペルシャコンピューティングもお読みください: http://behdad.org/download/Publications/persiancomputing/a007.pdf
名前付きブロック、たとえば\ p {アラビア語}は、ペルシア語の文字だけでなくアラビア語のスクリプト全体をカバーします。
プレゼンテーションフォーム(u + FB50-u + FDFF)はテキストでnotを使用する必要があり、標準範囲(u + 0600- u + 06FF)。
ペルシャ語のみをカバーするために、以下が必要です。
したがって、結果の正規表現は次のようになります。
^[\u0621-\u0624\u0626-\u063A\u0641-\u0642\u0644-\u0648\u064B-\u0652\u067E\u0686\u0698\u06AF\u06CC\u06A9\u0654\u670\u200c}]+$
ここにリストされているペルシア語の模範文字も参照してください。
http://unicode.org/cldr/trac/browser/trunk/common/main/fa.xml
正規表現がこれを行う方法であるかどうかはわかりませんが、問題はペルシャ語またはアラビア語、チニー、ロシア語のテキストのみに固有のものではありません。 文字がコードページに存在する かどうかを確認できるかもしれません。コードページにない場合、ユーザーが入力デバイスを使用してそれらを挿入できるかどうかは疑問です...
var encoding = Encoding.GetEncoding(1256);
var expect = "گ چ پ ژ";
var actual= encoding.GetBytes("گ چ پ ژ");
Assert.AreEqual(encoding.GetString(actual),expect);
このテストでは、入力が文字列とバイトを照合して往復する往復をテストします。リンクには、サポートされているコードページが表示されます。