2010-12-01 24 views
2

J'essaie de récupérer un nom de fichier qui ne peut pas être représenté en ASCII à partir de l'en-tête content-disposition.Décodage du nom de fichier d'en-tête Content-Encoding codé en Objective-C

Ce nom de fichier est codé en mots. Ci-dessous le nom de fichier codé:

=? 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? =

Comment obtenir le nom de fichier décodé (qui est en fait "ësté é úm nômé açentúadõ.xlsx")? PS: Je suis à la recherche d'une implémentation Objective-C.

+0

Pour ceux qui étaient curieux, comme moi: http://en.wikipedia.org/wiki/MIME#Encoded-Word –

+0

Cet encodage est connu comme [Quoted-Printable] (http://tools.ietf.org /html/rfc2045#section-6.7). – Gumbo

+0

Avez-vous vu cet en-tête sur le Web (c'est-à-dire sur une ressource HTTP)? Ils ne devraient pas vraiment utiliser quoted-printable ... –

Répondre

0

Vous voulez probablement rechercher un cadre de gestion MIME, mais je recherche en ligne et est venu avec rien, donc ....

Je ne pouvais pas trouver un exemple en ligne, donc je suis juste montrer la algorithme ici. Ce n'est pas le meilleur exemple puisque je fais une grosse hypothèse. Cela étant, la chaîne est toujours encodée en UTF-8.

Le codage Q est similaire au codage d'URL (codage en pourcentage), que le NSString de Foundation a déjà en charge pour le décodage. La seule différence (pratique) lors du décodage (il existe de plus grandes différences lors de l'encodage) est que les codages % sont plutôt des codages =.

Ensuite, il y a les éléments d'entrée et de sortie. Chaque bloc codé a le format =?charset-name?encoding-type? ... encoded string here ... ?=. Vous devriez vraiment lire le nom du jeu de caractères est l'utilisation de ce codage, et vous devriez vraiment lire le type de codage, car il peut être "Q" ou "B" (Base64).

Cet exemple fonctionne uniquement pour le codage Q (un sous-ensemble de quoted-printable). Vous devriez pouvoir le modifier facilement pour gérer les différents jeux de caractères et gérer l'encodage 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; 
} 

Ce sorties:

chrisbook-pro: ~ chris $ ./qp-decode 2010-12-01 18: 54: 42,903 QP-decode [9643: 903] chaîne décodée = este é Ŭm nome açentúadõ.xlsx

+0

Ah, désolé, j'ai manqué un peu. Vous voulez également remplacer tous les "_" (traits de soulignement) avec des espaces;) – d11wtq

+0

Correction du code selon mon commentaire. – d11wtq

+0

Ces '_' sont des espaces (voir [" Q "-codage] (http://tools.ietf.org/html/rfc2047#section-4.2)) – Gumbo

0

J'ai récemment implémenté une catégorie NSString qui décode MIME Encoded-Word avec codage Q ou codage B. Le code est disponible sur GitHub et est brièvement expliqué dans ce answer.