вывести юникод NSString в обратном порядке - PullRequest
1 голос
/ 22 января 2012

Я использовал этот код для печати английского 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);

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

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

Ответы [ 3 ]

3 голосов
/ 22 января 2012

У вас есть два цикла 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];
3 голосов
/ 22 января 2012

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

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);
2 голосов
/ 22 января 2012

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...