2 Stimmen

Dekodierung wortcodierter Content-Disposition-Header-Dateinamen in Objective-C

Ich versuche, einen Dateinamen abzurufen, der nicht in ASCII aus dem content-disposition-Header dargestellt werden kann.

Dieser Dateiname ist wortcodiert. Nachfolgend ist der kodierte Dateiname aufgeführt:

\=?UTF-8?Q?=C3=ABst=C3=A9_=C3=A9_=C3=BAm_n=C3=B4m=C3=A9?= =?UTF-8?Q?_a=C3=A7ent=C3=BAad=C3=B5.xlsx?=

Wie erhalte ich den entschlüsselten Dateinamen (der eigentlich "ësté é úm nômé açentúadõ.xlsx" lautet)?

PS: Ich bin auf der Suche nach einer Objective-C-Implementierung.

0 Stimmen

Für diejenigen, die neugierig waren, wie ich: de.wikipedia.org/wiki/MIME#Encoded-Word

0 Stimmen

Diese Kodierung ist bekannt als Zitiert-druckbar .

0 Stimmen

Haben Sie diese Kopfzeile im Web (d. h. auf einer HTTP-Ressource) gesehen? Sie sollten eigentlich nicht quoted-printable verwenden...

0voto

d11wtq Punkte 34050

Sie wollen wahrscheinlich für eine MIME-Handling-Framework zu suchen, aber ich suchte online und kam mit nichts, so....

Ich konnte online kein Beispiel finden, deshalb zeige ich hier nur den Algorithmus. Es ist nicht das beste Beispiel, da ich von einer großen Annahme ausgehe. Nämlich, dass die Zeichenfolge immer UTF-8 Q-kodiert ist.

Die Q-Kodierung ist wie die URL-Kodierung (Prozentkodierung), die Foundation's NSString bietet bereits Unterstützung für die Dekodierung. Der einzige (praktische) Unterschied bei der Dekodierung (bei der Kodierung gibt es größere Unterschiede) ist, dass % Kodierungen sind = Kodierungen zu verwenden.

Dann gibt es da noch den Lead-in und Lead-out Kram. Jeder kodierte Block hat das Format =?charset-name?encoding-type? ... encoded string here ... ?= . Sie sollten wirklich den Zeichensatznamen lesen, wenn Sie diese Kodierung verwenden, und Sie sollten wirklich den Kodierungstyp lesen, da er "Q" oder "B" (Base64) sein kann.

Dieses Beispiel funktioniert nur für Q-Encoding (eine Untermenge von quoted-printable). Sie sollten jedoch in der Lage sein, es leicht zu ändern, um die verschiedenen Zeichensätze und die Base64-Kodierung zu verarbeiten.

#import <Foundation/Foundation.h>

int main(void) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *encodedString = @"=?UTF-8?Q?=C3=ABst=C3=A9_=C3=A9_=C3=BAm_n=C3=B4m=C3=A9?= =?UTF-8?Q?_a=C3=A7ent=C3=BAad=C3=B5.xlsx?=";   
    NSScanner *scanner = [NSScanner scannerWithString:encodedString];
    NSString *buf = nil;
    NSMutableString *decodedString = [[NSMutableString alloc] init];

    while ([scanner scanString:@"=?UTF-8?Q?" intoString:NULL]
        || ([scanner scanUpToString:@"=?UTF-8?Q?" intoString:&buf] && [scanner scanString:@"=?UTF-8?Q?" intoString:NULL])) {
        if (buf != nil) {
            [decodedString appendString:buf];
        }

        buf = nil;

        NSString *encodedRange;

        if (![scanner scanUpToString:@"?=" intoString:&encodedRange]) {
            break; // Invalid encoding
        }

        [scanner scanString:@"?=" intoString:NULL]; // Skip the terminating "?="

        // Decode the encoded portion (naively using UTF-8 and assuming it really is Q encoded)
        // I'm doing this really naively, but it should work

        // Firstly I'm encoding % signs so I can cheat and turn this into a URL-encoded string, which NSString can decode
        encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"%" withString:@"=25"];

        // Turn this into a URL-encoded string
        encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"=" withString:@"%"];

        // Remove the underscores
        encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"_" withString:@" "];

        [decodedString appendString:[encodedRange stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    }

    NSLog(@"Decoded string = %@", decodedString);

    [decodedString release];

    [pool drain];

    return 0;
}

Diese Ausgaben:

chrisbook-pro:~ chris$ ./qp-decode 2010-12-01 18:54:42.903 qp-decode[9643:903] Dekodierter String = ësté é úm nômé açentúadõ.xlsx

0voto

BadPirate Punkte 25244

Ich habe hier eine einfachere/erfolgreichere Methode entwickelt, die einen Trick mit NSString percent escapes. verwendet.

https://stackoverflow.com/a/10888548/285694

0voto

hpique Punkte 115846

Ich habe kürzlich eine NSString-Kategorie implementiert, die MIME Encoded-Word entweder mit Q-Encoding oder B-Encoding dekodiert.

Der Code ist verfügbar unter GitHub und wird in diesem Dokument kurz erläutert Antwort .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X