我需要在 Asp.net/PHP上创建应用[欢迎两者]
用户可以使用arabic
用户名或English
用户名注册。
说用户使用English
用户名A
注册,
因此,当其他用户尝试使用Arabic
A
版本注册时,我需要拒绝它。
它的可行性如何?
有没有办法为A
获得唯一值?
感谢。
答案 0 :(得分:2)
只需操纵unicode字符串即可。例如,一个很好的编码选择是UTF-8。
您应该只在整个程序中操作unicode字符串,以避免在用户输入特殊字符时某些字符出现乱码的问题。
如果您要做的是将字符串与被认为等效的某些字符进行比较,例如使用英语和希腊语,A将等同于alpha,那么您需要构建一个等价列表,并将字符串转换为数字序列,其中每个数字是原始字符串中字符的等价类的编号。
最快的方法是在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));
然后比较两个变换后的字符串。
这称为整理,也可用于字符串的不区分大小写的比较(使'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
数组),但这将是另一个问题的问题。
答案 1 :(得分:1)
我认为你需要找到一种不同的方法,因为没有办法在字母表之间唯一地音译任意字符串。特别是在使用元音的拉丁字母和使用变音符号的阿拉伯字母之间。
有几种方法可以用阿拉伯语呈现几乎任何拉丁字符串。你有英语V,经常音译为ف或ٻ。除其他外,阿拉伯语Î和ذ也可以用几种方式用英语写成。这只是我努力记住我在高中学到的阿拉伯语。
简而言之,您必须构建一个启发式数据库,可以针对给定的阿拉伯语或英语字符串猜测该字符串在另一个字母表中的所有可能排列 - 并且仍然会对这些变体感到惊讶您的用户会想出来。