2016-09-06 21 views
1

我需要的兩個詞的範圍內的字符串,例如:NSString.rangeOfString返回異常結果與非拉丁字符

ยัฟิแก ไฟหก 

(這簡直是我打字PYABCD WASD) - 這是一個非因爲我不會講泰語,所以我是一個感性測試。

//Find all the ranges of each word 
var words: [String] = [] 
var ranges: [NSRange] = [] 

//Convert to nsstring first because otherwise you get stuck with Ranges and Strings. 
let nstext = backgroundTextField.stringValue as NSString //contains "ยัฟิแก ไฟหก" 
words = nstext.componentsSeparatedByString(" ") 
var nstextLessWordsWeHaveRangesFor = nstext //if you have two identical words this prevents just getting the first word's range 

for word in words 
     { 

      let range:NSRange = nstextLessWordsWeHaveRangesFor.rangeOfString(word) 
      Swift.print(range) 
      ranges.append(range) 

      //create a string the same length as word 
      var fillerString:String = "" 

      for i in 0..<word.characters.count{ 
      //for var i=0;i<word.characters.count;i += 1{ 
       Swift.print("i: \(i)") 
       fillerString = fillerString.stringByAppendingString(" ") 
      } 

      //remove duplicate words/letters so that we get correct range each time. 
      if range.length <= nstextLessWordsWeHaveRangesFor.length 
      { 
       nstextLessWordsWeHaveRangesFor = nstextLessWordsWeHaveRangesFor.stringByReplacingCharactersInRange(range, withString: fillerString) 
      }    
     } 

輸出:

(0,6) 
(5,4) 

那些範圍是重疊的。

由於範圍不一致,導致我嘗試使用NSLayoutManager.enumerateEnclosingRectsForGlyphRange的道路出現問題。

我怎樣才能得到正確的範圍(或在這種特殊情況下,非重疊範圍)?

+2

在代碼中只有一個打印語句,如何獲得兩個輸出行? –

+0

真的是僞代碼 - 試圖隔離問題。在應用程序中,它循環遍歷字符串中的單詞。 – glenstorey

+0

顯示問題的可重複的自包含示例會很有幫助。 –

回答

3

夫特String字符描述「擴展字形集羣」,並NSString 使用UTF-16碼分,因此字符串的長度根據您使用的表示而不同 。

例如,第一個字符"ยั"實際上是"ย"(U + 0E22)與發音符號" ั"(U + 0E31)的組合 。 這是一個String字符,而是兩個NSString字符。 因此,當您用 空格替換單詞時,索引會改變。

最簡單的解決方案是堅持一個,即StringNSString (如果可能)。既然你與NSString工作,改變

for i in 0..<word.characters.count { 

for i in 0..<range.length { 

應該解決的問題。填充字符串 的創建可以簡化爲

//create a string the same length as word 
let fillerString = String(count: range.length, repeatedValue: Character(" ")) 
1

刪除nstextLessWordsWeHaveRangesFor解決了問題(底部從range.length <= nstextLessWordsWeHaveRangesFor.length開始)。該變量的修改是改變範圍並給出意想不到的輸出。下面是當重複字去除被移除的結果:

var words: [String] = [] 

let nstext = "ยัฟิแก ไฟหก" as NSString 
words = nstext.componentsSeparatedByString(" ") 

for word in words { 
    let range = nstext.rangeOfString(word) 
    print(range) 
} 

輸出是:(0,6)(7,4)