我需要在 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,通常音译为ف或ٻ。阿拉伯语 خ 和 ذ 等也可以以多种方式用英语书写。这只是我努力记住我在高中学到的阿拉伯语。
简而言之,你必须建立一个启发式数据库,对于给定的阿拉伯语或英语字符串,可以猜测该字符串在其他字母表中的所有可能排列 - 你仍然会对用户会想出的变化感到惊讶。