2012-08-03 92 views
0

我有一個NSString和一個unicode代碼點範圍,它表示NSString中文本的特定部分。由於這個字符NSString代碼點不一一對應,我需要以某種方式將我的代碼點範圍轉換成相應的字符範圍。我該怎麼做呢?如何將unicode代碼點範圍轉換爲NSString字符範圍?

I know I can useNSString方法-rangeOfComposedCharacterSequencesForRange:一個字符範圍轉換成字形集羣範圍內,但我想要做的是排序是相反的,我無法找到的API,這些API方法的逆。即使有這樣的方法可用,我不認爲這正是我正在尋找的,因爲(如果我正確地理解這個)字形羣集是不是一樣的東西作爲unicode代碼點 ,並且實際上可以由多個代碼點組成。

回答

1

你有什麼是來自兩個不同世界的混合數據。您通常可能會得到一個Unicode代碼點範圍以及一個UTF-32字符串(其中對應關係是一對一的),因此提取子字符串將很簡單。你有兩個選擇:

  1. 在UTF-32世界的工作,你把數據之前爲一個NSString
  2. Unicode碼點範圍轉換爲UTF-16的單位範圍

我承擔從你的問題來看#2是你案例中最簡單的選擇。

就像你說的那樣,由於NSString字符是UTF-16單元,因此NSString中的字符不會與Unicode代碼點一一對應。但是,Unicode代碼點對應於NSString中的恰好1或2個字符。通過迭代NSString字符並計算Unicode代碼點,您可以很容易地編寫自己的範圍轉換例程。由於您甚至不關心UTF-16數據的字節順序,因爲有效的BMP字符,潛在代理和蹤跡代理不相交,這一點變得更加容易。 CFString提供了一些函數來確定每個字符是什麼。因此,在您計算的僞代碼中,您的計數如下所示:

for each NSString character { 
    if (CFStringIsSurrogateHighCharacter(character) || 
     CFStringIsSurrogateLowCharacter(character)) 
    { 
     Skip forward another character in the NSString 
    } 
    Increment count of Unicode code points stepped through 
}