获取两种语言字符串的唯一值


Get unique value for strings in two languages

我需要在 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,通常音译为ف或ٻ。阿拉伯语 خ 和 ذ 等也可以以多种方式用英语书写。这只是我努力记住我在高中学到的阿拉伯语。

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