1

Asp.net/PHPでアプリを作成する必要があります[どちらも大歓迎です]

arabicユーザーは、ユーザー名またはユーザー名で登録できEnglishます。

Englishそのユーザーがユーザー名で登録したと言うA

したがって、別のユーザーがArabicのバージョンに登録しようとした場合、Aそれを拒否する必要があります。

どのようにその可能性がありますか?

両方に固有の値を取得する方法はありますAか?

ありがとう。

4

2 に答える 2

2

Unicode文字列を操作するだけです。たとえば、エンコーディングの適切な選択はUTF-8です。

ユーザーが特殊文字を入力したときに一部の文字が文字化けする問題を回避するために、プログラム全体でUnicode文字列のみを操作する必要があります。

たとえば、英語やギリシャ語など、同等と見なされるいくつかの文字と文字列を比較する場合、Aはアルファと同等であるため、同等のリストを作成し、文字列を一連の数値に変換する必要があります。 、ここで、各番号は、元の文字列内の文字の等価クラスの番号です。

最も速い方法は、PHPで次のような辞書(キーと値のペア)を作成することです。

equiv=array('a'=>1, 'i'=>1, 'u'=>1, 'alif'=>1, 'b'=>2, 'baa'=>2, ...);

ここで、Unicodeの実際のアラビア文字に'alif'置き換えます。'baa'

次に、文字列を変換します。

transformed=array_map(function($c) { return $equiv[$c]; }, str_split($str));

次に、2つの変換された文字列を比較します。

これは照合と呼ばれ、大文字と小文字を区別しない文字列の比較にも使用できます(と'ab'同等にし'AB'ます)。

文字クラスを識別するために数字を使用する以外に、そのクラスの代表的な個人として文字を使用することを選択できます。次に、あなたはするでしょう:

function fold_char($c) {
    return array_key_exists($c, $equiv) ? $equiv[$c] : $c;
}
equiv=array('a'=>'a', 'A'=>'a', 'i'=>'a', 'I'=>'a', 'u'=>'a', 'U'=>'a' 'alif'=>'a', 'b'=>'b', 'B'=>'b'  'baa'=>'b', ...);
transformed=implode('', array_map(fold_char, str_split($str));

これにより、文字を含む文字列がに変換'a' 'B' 'U'され'aba'、文字'alif'を含む文字列が'baa''alif'変換される'aba'ため、これらは同等と見なされます。

次に、変換された文字列をユーザー名とともにデータベースに保存して、特定のユーザー名がすでに存在するかどうかをすばやく確認できます。

一部のデータベースエンジンでは、独自の照合シーケンス(基本的には上記の配列)を定義できることは知っていますequivが、それは別の質問の問題になります。

于 2012-08-08T11:36:54.503 に答える
1

アルファベット間の任意の文字列を一意に音訳する方法がないため、別のアプローチを見つける必要があると思います。特に、母音を使用するラテン語のアルファベットと分音符号を使用するアラビア語のアルファベットの間です。

事実上すべてのラテン文字列をアラビア語でレンダリングするには、いくつかの方法があります。英語の V は、しばしば fect や ٻ に音訳されます。とりわけ、アラビア語の خ と ذ は、いくつかの方法で英語で書くこともできます。そして、これは私が高校で学んだアラビア語を覚えるのに苦労しているだけです.

要するに、特定のアラビア語または英語の文字列について、その文字列の他のアルファベットへのすべての可能な順列を推測できるヒューリスティック データベースを構築する必要があります。思いつくでしょう。

于 2012-08-08T11:59:17.550 に答える