2012-08-08 105 views
1

我需要創建Asp.net/PHP [兩者都是歡迎]的應用兩種語言

用戶可以用​​用戶名或用戶名English註冊獲取字符串獨特的價值。

說,用戶用EnglishA

所以,當其他用戶試圖與Arabic版本的A註冊的話,我要否認註冊。

它的可能性如何?

有沒有辦法爲A獲得唯一的值?

謝謝。

回答

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數組),但這是另一個問題的問題。

+0

它是如何可能的?因爲用戶註冊了'英文'用戶名'testuser',那麼它的'阿拉伯'相當於'characters'。 – Red 2012-08-08 11:40:49

+0

「阿拉伯語相當」是什麼意思?如果英文名字爲'testuser',則使得utf-8序列U + 0074 U + 0075 U + 0073 U + 0074 U + 0075 U + 0073 U + 0065 U + 0072,即字符't',' e','s','t','u','s','e','r'。如果一些阿拉伯用戶輸入名稱testuser,它將產生相同的unicode字符序列。 Unicode是語言不可知的。 – 2012-08-08 12:02:57

+0

你是對的,但阿拉伯語等同於'testuser'的不同密鑰 – Red 2012-08-08 12:10:29

1

我想你將需要找到一種不同的方法,因爲沒有辦法將字符間的任意字符串唯一地音譯。特別是在使用元音的拉丁字母和使用變音符號的阿拉伯字母之間。

有幾種方法可以實際呈現阿拉伯語中的任何拉丁字符串。你有英文V,經常音譯爲or或ٻ。阿拉伯文和其他文字也可以用幾種方式用英文書寫。這只是我努力想要記住我在高中學到的阿拉伯語。

簡而言之,您必須建立一個啓發式數據庫,可以對某個給定的阿拉伯文或英文字符串猜測另一個字母表中該字符串的所有可能排列組合,並且仍然會一直對你的用戶會想到的變化。

+0

什麼將是不同的方法? :) – Red 2012-08-08 12:11:50

+0

我不知道。沒有通用解決方案,只有特定於您的應用程序的解決方案。什麼是業務原理,說用戶稱爲「Avner」相當於一個叫「آڀنر」?這不是必需的,這是一個決定,可以改變。 – 2012-08-08 12:35:30

+0

要求說所有......:D – Red 2012-08-09 05:52:13