Können Sie PHP-Funktion quoted_printable_decode () zu einer NSString-basierten, Objective-C Funktion / Kategorie Methode übersetzen?

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

Frage

http://php.net/quoted_printable_decode , ich Wege gefunden, es zu tun preg_replace verwenden. Jeder, der eine Code kennt, die einen normalen NSString etwas RFC 2045 Abschnitt 6.7?

umwandeln könnte

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Es gibt keine Methode auf Cocoa notierten druckbare Zeichenfolge zu entschlüsseln, aber man konnte leicht selbst etwas schreiben, wie:

@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

Andere Tipps

Für andere für diese Funktionalität suchen, Jason Coco Antwort funktioniert wirklich gut, hat aber einen wichtigen Fehler. Sie müssen vor der Rückkehr in ein Null-Zeichen an das Ende des utf8_string hinzuzufügen. So kurz vor der return-Anweisung, fügen Sie die Zeile *ep = '\0'; und das sollte es tun. Auch ich modifizierte es ein NSData Objekt eher als ein NSString zurückzukehren, da die decodierte Zeichenfolge eine andere Zeichenkodierung als UTF-8 verwenden. So etwas wie return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)]; funktioniert gut. Dann wird der Aufruf der Methode können die zurückgegebenen Daten von Füllung zurück in eine NSString kümmern die entsprechende Codierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top