2

NSString我从中得到了UIWebView包含 iPhone 表情符号和不包括表情符号的反转文本。我需要NSString再次显示反转,UIWebView但无法使用表情符号获得反转的字符串。我没有在字符串中识别表情符号字符。我有带有 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];
 }
4

1 回答 1

6

问题是许多表情符号字符在内部存储为两个字符的“代理对”。

例如,“THUMBS UP SIGN”是Unicode点U+1F44D,但是如果你把它存储在an中NSStringsubstringWithRange用来获取单个字符,你会得到两个字符:

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;
}

此函数正确反转包含表情符号字符的字符串。

注意:我省略了所有release,autorelease调用,因为我总是使用 ARC 编译。你必须在适当的地方再次添加。)

于 2012-11-07T13:27:32.013 回答