2011-01-13 2 views
1

У меня есть этот код:Функция делать символы преобразования автоматически

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock 
{ 
    NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding]; 


    someString = [ someString stringByReplacingOccurrencesOfString:@"%" withString: @"&" ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"|" withString: @"|" ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@" " withString: @" " ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"–" withString:@"-"]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"—" withString:@"——"]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"‘" withString:@"'" ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"’" withString:@"'" ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"‚" withString:@"," ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"“" withString:@"\"" ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"”" withString:@"\"" ]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"…" withString:@"..."]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"&#38;" withString:@"<"]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"&#39;" withString:@">"]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"&#8364;" withString:@"€"]; 
    someString = [ someString stringByReplacingOccurrencesOfString:@"&#8594;" withString:@"→"]; 

    if(nil != self.currentItemValue){ 
     [self.currentItemValue appendString:someString]; 
    } 
} 

Есть ли функция, чтобы сделать это преобразование символов автоматически?

+3

Вы могли бы разогреться, положив несколько ответов. – Abizern

+0

Может быть полезно? http://stackoverflow.com/questions/1067652/converting-amp-to-in-objective-c –

ответ

2

Вместо жесткого кодирования замены, как это, есть лучший способ.

Эти объекты имеют форму: &# + десятичное число + ;. Бит десятичного разряда - это базовая версия этого кода в кодировке Unicode. Таким образом, вы можете искать подстроки в этом формате, извлекать номер и напрямую преобразовывать его в символ.

Вот один из способов сделать это, используя RegexKitLite, чтобы найти строки:

NSString * source = @"&#38; &#39; &#124; &#160; &#8211; &#8212; &#8216; &#8217; &#8218; &#8220; &#8221; &#8230; &#8364; &#8594;"; 

NSString * regex = @"&#(\\d+);"; 
NSArray * matches = [source arrayOfCaptureComponentsMatchedByRegex:regex]; 

NSMutableString * decodedSource = [source mutableCopy]; 
for (NSArray * match in matches) { 
    NSString * fullMatch = [match objectAtIndex:0]; 
    NSString * decimalCode = [match objectAtIndex:1]; 

    unichar character = (unichar)[decimalCode intValue]; 
    NSString * replacement = [NSString stringWithFormat:@"%C", character]; 

    [decodedSource replaceOccurrencesOfString:fullMatch withString:replacement options:NSLiteralSearch range:NSMakeRange(0, [decodedSource length])]; 
} 

NSLog(@"decoded: %@", decodedSource); 
[decodedSource release]; 

На моей машине это пиловочник:

decoded: & ' |   – — ‘ ’ ‚ “ ” … € → 

Это не самый эффективный метод (это худший case a O(nm)), но это начало. :)

2

Вау, это довольно плохо, а также неэффективно. На минимальном минимуме перейдите к использованию NSMutableString и вместо этого выполните замену inline.

В любом случае, вы можете сделать это за один проход, но вам нужно написать код самостоятельно. Вы можете использовать NSScanner или метод, подобный -rangeOfString:options:range:, чтобы найти каждую последующую сущность, а затем самостоятельно определить ее замену. Если вы работаете с NSMutableString, вы можете затем заменить объект своей заменой и продолжить поиск (после изменения вашего местоположения (в случае NSScanner) или диапазона соответственно для учета разницы в длине между сущностью и заменяющим символом) ,

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