2012-11-07 21 views
2

我從UIWebView獲取NSString,其中包含iPhone表情符和倒排文字(不包括表情符號)。我需要在UIWebView中再次顯示NSString的反轉,但無法使用表情符號獲取反轉字符串。我沒有識別字符串中的表情符號字符。我有iOS 6.0的xcode 4.5。這裏是我的代碼:在字符串中標識表情符號,並且全部反映

- (NSString *) createReverseStringFromString:(NSString *)inputString { 
    if (inputString.length <= 0) 
    return inputString; 

NSMutableString *mutableReverseString = [[NSMutableString alloc] 
initWithCapacity:inputString.length]; 
Thfor (NSInteger i = inputString.length -1; i >= 0; i--) { 

    NSString *characterString = [inputString substringWithRange:NSMakeRange(i, 1)]; 
    [mutableReverseString appendString:characterString]; 

    NSLog(@"mutableReverseString..%@",mutableReverseString); 
} 

NSString *outputString = [mutableReverseString copy]; 
[mutableReverseString release]; 
return [outputString autorelease]; 
} 
+0

什麼ü通過逆轉的表情符號是什麼意思? –

+0

我想扭轉所有字符不是表情符號 –

回答

6

的問題是,很多表情符在內部存儲爲兩個字符的「代理對」。

例如,「讚許SIGN」是Unicode點U + 1F44D,但如果你將它存儲在NSString和使用substringWithRange獲得單個字符,你會得到兩個大字:

U+D83D, U+DC4D 

這是U + 1F44D的UTF-16替代品對。

當然,如果你反轉這兩個字符,輸出就是垃圾。

的解決方案是使用rangeOfComposedCharacterSequenceAtIndex得到其中「屬於一起」的字符序列:

- (NSString *) createReverseStringFromString:(NSString *)inputString { 
    if (inputString.length <= 0) 
     return inputString; 

    NSMutableString *mutableReverseString = [[NSMutableString alloc] 
         initWithCapacity:inputString.length]; 

    NSInteger i = inputString.length; 
    while (i > 0) { 
     NSRange range = [inputString rangeOfComposedCharacterSequenceAtIndex:i-1]; 
     NSString *characterString = [inputString substringWithRange:range]; 
     [mutableReverseString appendString:characterString]; 
     i = range.location; 
    } 

    NSString *outputString = [mutableReverseString copy]; 
    return outputString; 
} 

此函數正確反轉含有表情符號字符的字符串。

注:我省略了所有releaseautorelease電話,因爲我總是ARC編譯您必須再次補充說,在適當情況下)。

+0

謝謝你的真正作品 –

+0

很好的解釋!它幫助我很多!維基鏈接關於UTF-16和代理對:http://en.wikipedia.org/wiki/UTF-16 – ideawu

+0

很好的解釋!請注意,如果您使用表情符號字符,這將無法正常工作,因爲標誌實際上是四個字符。 – drakos

相關問題