2009-11-03 18 views
9

È un loro metodo per codificare/decodificare HTML e URL (in Xcode, utilizzando Objective-C)?Codifica URL e codifica HTML NSStrings

[NSString stringWithContentsOfFile:<#(NSString *)path#> encoding:<#(NSStringEncoding)enc#> error:<#(NSError **)error#>] 

Questo non sembra funzionare come mi aspettavo. Ho pensato che convertirà caratteri speciali come "<" in entità HTML equivalenti, ad esempio "<" in questo caso.

Ecco un riferimento al link W3School relative a questo argomento (generale):

HTML URL Encoding Reference

HTML Entities Reference

Ringraziandovi in ​​anticipo.

risposta

19

Restituisce una rappresentazione del ricevitore utilizzando una determinata codifica per determinare la percentuale di escape necessaria per convertire il ricevitore in una stringa di URL legale.

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 

e

restituisce una nuova stringa realizzato sostituendo nel ricevitore tutti percento fugge con i caratteri corrispondenti come determinato da un dato di codifica.

- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 
+1

Leggi le altre risposte per i metodi per quotare stringhe come XML (ad esempio, sostituzione dell'entità e

11

Il metodo si citano legge un file dal disco con una data codifica dei caratteri (come UTF-8 o ASCII). Non ha nulla a che fare con l'escape dell'URL o dell'HTML.

Se si desidera aggiungere fughe URL per cento, si desidera che questo metodo:

[myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 

Assicurarsi di leggere la documentazione su questo metodo, perché ci sono alcune sottigliezze su ciò che sfugge e ciò che lascia soli. In alcuni casi, potrebbe essere necessario utilizzare il più complesso, ma più flessibile, CFURLCreateStringByAddingPercentEscapes(). (Se lo fai, si noti che si può lanciare CFStringRef-NSString * e viceversa.)

Non c'è niente di costruito in che io sappia fare entità XML/HTML in stile fuga, ma questa funzione dovrebbe gestire le basi:

NSString * convertToXMLEntities(NSString * myString) { 
    NSMutableString * temp = [myString mutableCopy]; 

    [temp replaceOccurrencesOfString:@"&" 
          withString:@"&amp;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"<" 
          withString:@"&lt;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@">" 
          withString:@"&gt;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"\"" 
          withString:@"&quot;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"'" 
          withString:@"&apos;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 

    return [temp autorelease]; 
} 
+8

Wow, il tuo codice sembra un giardino francese formale. –

+1

Se stavo scrivendo questo per il mio codice, in realtà avrei definito un metodo -replaceOccurrencesOfString: withString: in una categoria su NSMutableString e l'ho usato per evitare la ripetizione. (Probabilmente avrei scritto questo come un metodo NSMutableString invece di una funzione, anche a pensarci.) Ma non volevo includere troppo in questo. –

+0

Dai un'occhiata alla risposta di CocoaFu. È corretto. –

3

per eseguire la codifica entità HTML/XML, è possibile utilizzare una funzione di CFMutableString:

NSString *result = .....;
CFStringTransform((CFMutableStringRef)result, NULL, kCFStringTransformToXMLHex, false);

impostando l'ultimo parametro di CFStringTransform true, dovrebbe funzionare per la decodifica (esadecimale) entità pure.

3

Usa CFStringTransform per HTML codifica entità/decodifica:

CFStringTransform((CFTypeRef)yourMutableString, NULL, CFSTR("Any-Hex/XML"), FALSE);

È necessario utilizzare l'ICU trasformare "Qualsiasi-Hex/XML". kCFStringTransformToXMLHex non è abbastanza aggressivo.

+0

Che tipo di entità sono state ignorate da kCFStringTransformToXMLHex? –

+1

@StevenKramer Ad esempio,> o &. – fzwo