2012-01-22 4 views
1

Я использовал этот код, чтобы напечатать на английском NSString в обратном порядке:печати Юникоде 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 *[email protected]""; 
    for(int i=0;i<[temp count];i++) 
    { 
     reverseString=[NSString stringWithFormat:@"%@%@",reverseString,[temp objectAtIndex:i]]; 
    } 
    NSLog(@"%@",reverseString); 

, но этот код работает только с английскими словами, поэтому, когда я пытаюсь использовать арабское слово, как это: تجريب консоль покажет случайные английские символы.

Как я могу использовать этот код для печати обращенной версии слова выше (и любых других подобных арабских (unicode) строк)?

ответ

3

Необходимо использовать %C (верхний регистр C) вместо спецификатора формата %c (нижний регистр с) при первом вызове stringWithFormat. Спецификатор формата «c» в нижнем регистре предназначен для 8-битных символов; верхний регистр «C» предназначен для юникода.

EDIT: Если вы хотите сделать его более эффективно, копировать данные в массив 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); 
+0

спасибо большое чувак – JAHelia

3

У вас есть два для петель там, и этот код очень неэффективно. Я хотел бы использовать 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]; 
+0

спасибо за этот очень эффективный кусок кода – JAHelia

2

какао способ делает это:

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

И это будет работать без утечки reversedString при компиляции с ARC.

+0

awesome Abizern ... спасибо миллиону ... – JAHelia

Смежные вопросы