簡體   English   中英

如何正確轉換為可可中搜索的規范字符串?

[英]How to properly convert to a canonical string for searching in Cocoa?

我有一個字符串字段,我知道用戶以后會想要搜索。 受WWDC 2012核心數據最佳實踐會議的啟發,我計划將字符串的規范化版本存儲到單獨的字段中,以便優化搜索謂詞。

我主要關心的是不區分大小寫,但是當我規范化字符串時,我認為我也應該規范unicode表示。 但是我想確保使用正確的規范化形式(即C,D,KC或KD)。 是否先轉換為小寫字母有關系嗎? (本地化不是我的強項。)

所以:

  1. 有什么合適的方法可以調用來對NSString進行搜索標准化?
  2. 確保標准化版本存儲的最佳方法是什么。

我將發布我的第一次嘗試作為答案,但我很想聽聽我做錯了什么,其他建議或改進。 (不幸的是,盡管他們在該視頻中顯示了搜索謂詞,但我認為他們沒有顯示該會話中的代碼。)

對於您描述的用例,選擇預分解還是分解(C或D;盡管可以節省一些空間)並不重要,但請仔細考慮是否要規范或兼容(K形式)。 TR15有一個很好的圖,總結了這些差異(圖6):

也就是說:如果有人搜索“ ſ”(“ long s ”),您是否要匹配“ s”(反之亦然)? 這些被認為是“格式區別”,因此您不應該用這些格式替換用戶輸入的文本(因為丟失數據),但是在搜索時可能要忽略它們。

對於不區分大小寫的比較,僅使兩個字符串都變為小寫並進行比較是不夠的。 它將適用於英語,但是在某些語言中,小寫和大寫之間的映射(如果甚至存在這種區別)還不清楚。 W3C Wiki 很好地總結了這些“案例折疊”問題 不幸的是,您不能通過將數據保存在一個“ case”中來優化存儲空間,只有在您知道字符串和語言環境的情況下才能進行適當的比較。

幸運的是,使用NSString它是-compare:options:range:locale: NSCaseInsensitiveSearch您可以指定NSCaseInsensitiveSearch選項和語言環境(如果知道的話),它們將為您處理這些大小寫折疊問題(另請NSDiacriticInsensitiveSearchNSWidthInsensitiveSearch以查看您是否也想知道這些差異)。

我目前打算做的是覆蓋該字段的設置方法,如下所示:

- (void)setName:(NSString *)value
{
    [self willChangeValueForKey:@"name"];
    [self setPrimitiveValue:value forKey:@"name"];
    [self didChangeValueForKey:@"name"];

    //Store normalized for for searching
    [self willChangeValueForKey:@"searchName"];
    [self setPrimitiveValue:[[value lowercaseStringWithLocale:[NSLocale currentLocale]] decomposedStringWithCompatibilityMapping] forKey:@"searchName"];
    [self didChangeValueForKey:@"searchName"];
}

我還使searchName屬性為只讀。

暫無
暫無

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

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