簡體   English   中英

比較具有非英文字符的字符串?

[英]Compare strings with non-English characters?

我需要比較網站上搜索機制的字符串。 我使用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”),則不會返回任何內容。

為什么會這樣,我該如何解決?

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

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

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

采用

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

要么

c.IndexOf(vm, StringComparison.OrdinalIgnoreCase)

Ordinal表示Unicode,逐字節,與區域性無關的比較。

這是Joel Spolsky 對字符集問題介紹 一個非常有趣的閱讀。

簡而言之,網頁需要在頁面開始時告訴您正在使用什么字符集。 C#正在對字符串使用unicode(以UTF-16編碼為標准格式),這說明了在csharp中可以找到的含義

希望這會幫助你。

您搜索什么? 在xml文件上,在db4o文件上,在sql上? 數據庫的字符編碼很重要。 您可以在xml中設置utf編碼來處理它; 和db4o,它已經可以在對象上安全地工作了,在sql端,您必須設置charachter編碼。

如果您的數據庫將值保留為char(50)或varchar(50),則它可能會丟失不同的字符,要保留不同的字符,則應在sql數據庫中使用nchar,nvarchar。 不要忘記檢查您的數據庫字符編碼,即使它沒有太多必要

您正在處理哪種列表? 普通列表還是ORM? 如果它是純列表,請使用string.Compare()

索引是搜索的重要組成部分。 我認為最好使用諸如LuceneSolr之類的現成固體來為您服務。

如果您仍然堅持使用非ASCII字符搜索正則表達式,則可能應該了解unicode類別的更多信息,然后使用它們來去除任何重音符號(例如,使用\\p{P}\\p{M} )在文本中搜索該單詞。

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

感謝所有提供建議的人,但不幸的是,它們似乎無關緊要。 事實證明,包含()對於非英語字符完全沒有問題。 問題是有問題的數據庫字段具有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();
        }

我發現這是因為,當包含非英語字符的另一個字段時,Contains()代碼可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM