Расшифровка кодированного по имени слова файла заголовка Content-Disposition в Objective-C - PullRequest
2 голосов
/ 01 декабря 2010

Я пытаюсь получить имя файла, которое не может быть представлено в ASCII, из заголовка расположения содержимого.

Это имя файла закодировано в слове. Ниже приведено кодированное имя файла:

= UTF-8? Q? = C3 = ABst = C3 = A9_ = C3 = A9_ = C3 = BAm_n = C3 = B4m = C3 = A9? = =? UTF-8? Q? _A = C3 = A7ent = С3 = Baad = С3 = B5.xlsx? =

Как получить расшифрованное имя файла (на самом деле это "ésté úm nômé açentúadõ.xlsx")?

PS: я ищу реализацию Objective-C.

Ответы [ 3 ]

0 голосов
/ 05 июня 2012

Здесь был создан более простой / успешный метод, использующий трюк с использованием процентных выходов NSString.

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

0 голосов
/ 24 декабря 2012

Недавно я реализовал категорию NSString, которая декодирует MIME Encoded-Word с использованием Q-кодирования или B-кодирования.

Код доступен на GitHub и кратко поясняется в этом ответе .

0 голосов
/ 01 декабря 2010

Вы, вероятно, хотите найти среду обработки MIME, но я искал онлайн и ничего не нашел, так что ...

Я не смог найти пример в Интернете, поэтому я просто показываю алгоритм здесь. Это не лучший пример, так как я делаю большое предположение. При этом строка всегда кодируется в кодировке UTF-8.

Q-кодирование похоже на URL-кодирование (процентное кодирование), которое NSString Foundation уже имеет поддержку декодирования. Единственное (практическое) различие при декодировании (есть большие различия при кодировании) заключается в том, что % кодировки вместо этого = кодировки.

Тогда есть начальный и конечный материал. Каждый кодированный блок имеет формат =?charset-name?encoding-type? ... encoded string here ... ?=. Вы должны действительно прочитать имя кодировки, используя эту кодировку, и вы действительно должны прочитать тип кодировки, поскольку это может быть «Q» или «B» (Base64).

Этот пример работает только для Q-кодирования (подмножество quoted-printable). Вы должны иметь возможность легко модифицировать его для обработки различных кодировок и обработки кодировки Base64.

#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;
}

Это выводит:

chrisbook-pro: ~ chris $ ./qp-decode 2010-12-01 18: 54: 42.903 qp-decode [9643: 903] Декодированная строка = sést úm nômé açentúadõ.xlsx

...