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
Pour ceux qui étaient curieux, comme moi: http://en.wikipedia.org/wiki/MIME#Encoded-Word –
Cet encodage est connu comme [Quoted-Printable] (http://tools.ietf.org /html/rfc2045#section-6.7). – Gumbo
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 ... –