2

iPhoneの絵文字と絵文字を除く反転テキストを含むNSStringから取得していました。UIWebViewで逆を表示する必要があり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

問題は、多くの絵文字が 2 つの文字の「サロゲート ペア」として内部的に保存されていることです。

たとえば、「THUMBS UP SIGN」は Unicode ポイント U+1F44D ですが、これを に格納してNSStringを使用substringWithRangeして 1 文字を取得すると、2 文字が取得されます。

U+D83D, U+DC4D

これは、U+1F44D の UTF-16 サロゲート ペアです。

もちろん、この 2 つの文字を逆にすると、出力はゴミになります。

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私は常に ARC でコンパイルするため、すべての,呼び出しを省略しautoreleaseました。必要に応じて再度追加する必要があります。)

于 2012-11-07T13:27:32.013 に答える