Se puede traducir función de php quoted_printable_decode() a un NSString basado en objetivos de la función de C / de la categoría de método?

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

Pregunta

En http://php.net/quoted_printable_decode, He encontrado la manera de hacerlo con preg_replace.Cualquiera que sepa de cualquier código que podría convertir a una normal NSString a algo RFC 2045 sección 6.7?

Gracias de antemano!

¿Fue útil?

Solución

No hay ningún método en Cocoa para decodificar una cadena imprimible entre comillas, pero podría escribir fácilmente usted mismo, como:

@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

Otros consejos

Para otros, en busca de esta funcionalidad, Jason del Coco respuesta funciona muy bien, pero tiene un problema importante.Usted necesita para añadir un carácter nulo al final de la utf8_string antes de regresar.Justo antes de que la instrucción return, agregar la línea *ep = '\0'; y que debe hacer el truco.También, la he modificado para devolver un NSData objeto en lugar de un NSString, desde el decodificado cadena puede utilizar una codificación de caracteres diferente de UTF-8.Algo como return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)]; funciona bien.A continuación, el método de llamada puede tomar el cuidado de relleno de los datos devueltos de nuevo en un NSString utilizando la codificación adecuada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top