以相反的顺序打印unicode NSString

时间:2012-01-22 12:20:55

标签: iphone objective-c ios

我已使用此代码以相反顺序打印英文NSString

     NSString *str = term;
    NSMutableArray *temp=[[NSMutableArray alloc] init];
    for(int i=0;i<[str length];i++)
    {
        [temp addObject:[NSString stringWithFormat:@"%c",[str characterAtIndex:i]]];
    }
    temp = [NSMutableArray arrayWithArray:[[temp reverseObjectEnumerator] allObjects]];
    NSString *reverseString=@"";
    for(int i=0;i<[temp count];i++)
    {
        reverseString=[NSString stringWithFormat:@"%@%@",reverseString,[temp objectAtIndex:i]];
    }
    NSLog(@"%@",reverseString);

但是此代码仅适用于英文单词,因此当我尝试使用这样的阿拉伯语单词时:تجريب控制台将显示随机英文字符。

如何使用此代码打印上述单词的反转版本(以及任何其他类似的阿拉伯语(unicode)字符串)?

3 个答案:

答案 0 :(得分:3)

在第一次调用%C时,您需要使用%c(大写C)而不是stringWithFormat(小写c)格式说明符。小写的'c'格式说明符用于8位字符;大写的'C'代表unicode。

编辑:如果您想更有效地执行此操作,请将数据复制到unichar元素数组中,反转数组,并将结果反馈到另一个NSString 。这使您可以在Length/2步骤中反转字符串:

NSString * s = @"تجريب";
unichar *cc = (unichar*)malloc(s.length+1);
[s getCharacters:cc];
for (NSUInteger i=0 ; i < s.length/2 ; i++) {
    // swap elements at i and s.length-i-1
    unichar tmp = cc[i];
    cc[i] = cc[s.length-i-1];
    cc[s.length-i-1] = tmp;
}
s = [NSString stringWithCharacters:cc length:s.length];
free(cc);
NSLog(@"%@", s);

答案 1 :(得分:3)

你有两个for循环,这个代码非常低效。我使用substringWithRange:而不是characterAtIndex:,并通过向后迭代字符串将其直接附加到输出字符串:

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

    NSMutableString *mutableReverseString = [[NSMutableString alloc] initWithCapacity:inputString.length];
    for (NSInteger i = inputString.length -1; i >= 0; i--) {
        NSString *characterString = [inputString substringWithRange:NSMakeRange(i, 1)];
        [mutableReverseString appendString:characterString];
    }

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

然后您可以像这样使用此方法:

NSString *inputString = @"تجريب";
NSString *outputString = [self createReverseStringFromString:inputString];

答案 2 :(得分:2)

Cocoa的做法:

NSString *originalString = @"تجريب";

NSUInteger stringLength = originalString.length;

NSMutableString *reversedString = [[NSMutableString alloc] initWithCapacity:stringLength];

while (stringLength) {
    [reversedString appendFormat:@"%C", [originalString characterAtIndex:--stringLength]];
}

NSLog(@"The reversed string is %@:", reversedString);

当使用ARC编译时,这将不会泄漏reversedString