Вы, вероятно, хотите найти среду обработки 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