преобразование строк, содержащих \ u ####, в символы на iOS iPhone - PullRequest
2 голосов
/ 10 декабря 2010

Я получаю ответ JSON в переменной NSData, а затем преобразовываю NSDATA в NSString:

NSString *aStr = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];

Проблема в том, что эта строка теперь содержит последовательности символов в формате \ u ####.(например, Джо).

Я хочу преобразовать все такие вхождения с помощью их односимвольного представления.(например, Джо должен стать Джо.

Любые идеи о том, как это сделать?

Кроме того, кто-то может указать мне ресурс, где я могу узнать правильную терминологию для этого?

Большое спасибо!

1 Ответ

1 голос
/ 14 сентября 2011

Я слишком долго искал ответ на этот вопрос сегодня ... наконец-то, просто укусил пулю и написал свою собственную категорию на NSString. Не стесняйтесь исправлять ошибки, я не волшебник юникода. Это определенно не работает с юникодом после \uffff, но мне это не нужно в моей ситуации.

@interface NSString (UnicodeAdditions)
-(NSString *) unescapeUnicode;
@end

@implementation NSString (UnicodeAdditions)

-(NSString *) unescapeUnicode {
    NSString *input = self;
    int x = 0;
    NSMutableString *mStr = [NSMutableString string];

    do {
        unichar c = [input characterAtIndex:x];
        if( c == '\\' ) {
            unichar c_next = [input characterAtIndex:x+1];
            if( c_next == 'u' ) {

                unichar accum = 0x0;
                int z;
                for( z=0; z<4; z++ ) {
                    unichar thisChar = [input characterAtIndex:x+(2+z)];
                    int val = 0;
                    if( thisChar >= 0x30 && thisChar <= 0x39 ) { // 0-9
                        val = thisChar - 0x30;
                    }
                    else if( thisChar >= 0x41 && thisChar <= 0x46 ) { // A-F
                        val = thisChar - 0x41 + 10;
                    }
                    else if( thisChar >= 0x61 && thisChar <= 0x66 ) { // a-f
                        val = thisChar - 0x61 + 10;
                    }
                    if( z ) {
                        accum <<= 4;
                    }

                    accum |= val;
                }
                NSString *unicode = [NSString stringWithCharacters:&accum length:1];
                [mStr appendString:unicode];

                x+=6;
            }
            else {
                [mStr appendFormat:@"%c", c];
                x++;
            }           
        }
        else {
            [mStr appendFormat:@"%c", c];
            x++;
        }
    } while( x < [input length] );

    return( mStr );
}

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