Riesci a tradurre la funzione php quoted_printable_decode () in un metodo di categoria / funzione obiettivo-C basato su NSString?

StackOverflow https://stackoverflow.com/questions/491678

Domanda

In http://php.net/quoted_printable_decode , ho trovato il modo di farlo usando preg_replace. Chiunque conosca un codice che potrebbe convertire un normale NSString in qualcosa RFC 2045 sezione 6.7?

Grazie in anticipo!

È stato utile?

Soluzione

Non c'è alcun metodo su Cocoa per decodificare una stringa stampabile tra virgolette, ma potresti facilmente scrivere qualcosa tu stesso, come:

@interface NSString (QuotedPrintableStrings)
+(NSString*)stringWithQuotedPrintableString:(const char *)qpString;
@end

@implementation NSString (QuotedPrintableStrings)

+(NSString*)stringWithQuotedPrintableString:(const char *)qpString
{
    const char *p = qpString;
    char *ep, *utf8_string = malloc(strlen(qpString) * sizeof(char));
    NSParameterAssert( utf8_string );
    ep = utf8_string;

    while( *p ) {
        switch( *p ) {
            case '=':
                NSAssert1( *(p + 1) != 0 && *(p + 2) != 0, @"Malformed QP String: %s", qpString);
                if( *(p + 1) != '\r' ) {
                    int i, byte[2];
                    for( i = 0; i < 2; i++ ) {
                        byte[i] = *(p + i + 1);
                        if( isdigit(byte[i]) )
                            byte[i] -= 0x30;
                        else
                            byte[i] -= 0x37;
                        NSAssert( byte[i] >= 0 && byte[i] < 16, @"bad encoded character");
                    }
                    *(ep++) = (char) (byte[0] << 4) | byte[1];
                }
                p += 3;
                continue;
            default:
                *(ep++) = *(p++);
                continue;
        }
    }
    return [[[NSString alloc] initWithBytesNoCopy:utf8_string length:strlen(utf8_string) encoding:NSUTF8StringEncoding freeWhenDone:YES] autorelease];
}

@end

Altri suggerimenti

Per gli altri che cercano questa funzionalità, La risposta di Jason Coco funziona davvero bene, ma ha un bug importante. È necessario aggiungere un carattere null alla fine di utf8_string prima di tornare. Quindi, appena prima dell'istruzione return, aggiungi la riga *ep = '\0'; e questo dovrebbe fare il trucco. Inoltre, l'ho modificato per restituire un oggetto NSData anziché un NSString, poiché la stringa decodificata potrebbe utilizzare una codifica di caratteri diversa da UTF-8. Qualcosa come return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)]; funziona bene. Quindi il metodo chiamante può occuparsi di reinserire i dati restituiti in un NSString usando la codifica appropriata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top