2011-04-07 303 views
2

我需要爲網站上的搜索機制比較字符串。我使用C#。我嘗試了兩種方式:將字符串與非英文字符進行比較?

consultants.Where(x => 
    x.Description.ToLower().Contains(vm.Description.ToLower())); 

consultants.Where(x => 
    Regex.IsMatch(x.Description, vm.Description, RegexOptions.IgnoreCase)); 

都工作得不錯所有的英文字符。所以如果我搜索一下,比如說「英語」,那沒問題。但只要我嘗試搜索包含非英文字符的字符串,它就不起作用。例如,如果我嘗試搜索單詞「språk」(瑞典語爲「language」),它將不會返回任何內容。

這是爲什麼,我該如何解決它?

+0

有什麼應該匹配「språk」在那裏?什麼? – 2011-04-07 08:49:03

+2

檢查以下是否是原因。 [String.ToLower()是語言相關](http://msdn.microsoft.com/en-us/library/aa904312(v = VS.71).aspx)[正則表達式也是文化敏感](http:// msdn.microsoft.com/en-us/library/hs600312.aspx) – 2011-04-07 08:52:17

回答

0

你在搜索什麼?在一個XML文件上,在一個db4o文件上,在SQL?數據庫的字符編碼很重要。你可以在xml中使用utf-coding來處理它;和db4o它已經是安全的對象工作,在SQL端你必須設置charachter編碼。

如果你的數據庫的值是char(50)或varchar(50),它可能會錯過不同的字符,爲了容納不同的字符,你應該在你的sql數據庫中使用nchar,nvarchar。不要忘記檢查你的數據庫字符編碼,即使它不是必要的

0

你正在處理什麼樣的列表?一個普通的列表或一個ORM?如果它是一個普通列表,則使用string.Compare()

2

爲了正確比較非英文字符,您應該爲此使用適當的文化規則。例如。你可以創建自己的不區分大小寫StringComparer瑞典和Contains方法使用它:

var swedishComparer = StringComparer.Create(new CultureInfo("sv-Se"), true); 

consultants = consultants 
    .Where(x => 
     x.Description.Contains(vm.Description, swedishComparer) 
    ).ToList(); 
0

索引是搜索的重要組成部分。我認爲你最好通過使用一些準備好和堅實的東西來服務,比如LuceneSolr

如果你仍然堅持對非ASCII字符的搜索使用正則表達式,你應該尋找在這個詞之前瞭解更多關於unicode categories,然後用它們來剝奪任何重音符號(例如,與\p{P}\p{M}條)文本。

注意:您也可能需要normalize使用FormC標誌的字符串,以分解和鋼帶/更有效地搜索

1

這裏是一個introduction to the character set problem由Joel Spolsky的。一個非常有趣的閱讀。

總之,網頁需要告訴你它在頁面的最開始使用的字符集。 C#使用unicode(以UTF-16編碼作爲標準)字符串,解釋這意味着您可以在這裏找到csharp in depth

希望這會對您有所幫助。

2

使用

String.Equals(c, vm, StringComparison.OrdinalIgnoreCase) 

c.IndexOf(vm, StringComparison.OrdinalIgnoreCase) 

Ordinal裝置的Unicode,字節每字節,非培養比較。

0

感謝所有提供建議的人,但不幸的是他們似乎無關緊要。事實證明,Contains()對於非英文字符完全沒有問題。問題是,有問題的數據庫字段已經HTML編碼的文本,所以我需要使用HtmlDecode琴絃控制器比較:

 if (vm.Description != "") 
     { 
      //HttpUtility.HtmlDecode needed because text in Description field is HtmlEncoded! 
      consultants = consultants.Where(x => HttpUtility.HtmlDecode(x.Description).ContainsCaseInsensitive(vm.Description)).ToList(); 
     } 

我發現了這一點,因爲載有()搜索另一場時,代碼工作正常非英文字符。