1

我需要在Asp.net/PHP 上创建一个应用程序 [都欢迎]

用户可以使用arabic用户名或English用户名注册。

说用户使用English用户名注册A

因此,当另一个用户尝试注册的Arabic版本时,A我需要拒绝它。

怎么可能?

有没有办法让两者都获得独特的价值A

谢谢。

4

2 回答 2

2

只需操作unicode字符串。例如,一个不错的编码选择是 UTF-8。

您应该只在整个程序中操作 unicode 字符串,以避免在用户输入特殊字符时某些字符出现乱码的问题。

如果您想要做的是将字符串与一些被认为等效的字符进行比较,例如英语和希腊语,A 将等同于 alpha,那么您需要构建一个等价列表,并将字符串转换为数字序列,其中每个数字是原始字符串中字符的等价类的编号。

最快的方法是在 PHP 中构建一个像这样的字典(键/值对):

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

您将在其中替换'alif''baa'unicode 中的实际阿拉伯字符。

然后,转换字符串:

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

然后比较两个转换后的字符串。

这称为整理,也可用于不区分大小写的字符串比较('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,通常音译为 ف 或 ٻ。阿拉伯语 خ 和 ذ 等也可以用多种方式用英语书写。这只是我在努力记住我在高中学到的阿拉伯语。

简而言之,您必须建立一个启发式数据库,该数据库可以猜测给定的阿拉伯语或英语字符串,该字符串在另一个字母表中的所有可能排列 - 而且您仍然会不断对您的用户的变化感到惊讶会想出。

于 2012-08-08T11:59:17.550 回答