我需要在Asp.net/PHP 上创建一个应用程序 [都欢迎]
用户可以使用arabic
用户名或English
用户名注册。
说用户使用English
用户名注册A
,
因此,当另一个用户尝试注册的Arabic
版本时,A
我需要拒绝它。
怎么可能?
有没有办法让两者都获得独特的价值A
?
谢谢。
我需要在Asp.net/PHP 上创建一个应用程序 [都欢迎]
用户可以使用arabic
用户名或English
用户名注册。
说用户使用English
用户名注册A
,
因此,当另一个用户尝试注册的Arabic
版本时,A
我需要拒绝它。
怎么可能?
有没有办法让两者都获得独特的价值A
?
谢谢。
只需操作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
上面的数组),但这将是另一个问题的问题。
我认为您将需要找到一种不同的方法,因为无法将任何任意字符串唯一地音译为字母表。特别是在使用元音的拉丁字母和使用变音符号的阿拉伯字母之间。
有几种方法可以用阿拉伯语呈现几乎任何拉丁字符串。您有英语 V,通常音译为 ف 或 ٻ。阿拉伯语 خ 和 ذ 等也可以用多种方式用英语书写。这只是我在努力记住我在高中学到的阿拉伯语。
简而言之,您必须建立一个启发式数据库,该数据库可以猜测给定的阿拉伯语或英语字符串,该字符串在另一个字母表中的所有可能排列 - 而且您仍然会不断对您的用户的变化感到惊讶会想出。