Разметка Mime Encoded-Word в Objective-C

Поддерживает ли OS X или iOS API для анализа MIME Encoded-Word ? Эти прекрасные строки:

=?iso-8859-1?Q?=A1Hola,_se=F1or!?= 

Кроме того, существует ли известная библиотека с открытым исходным кодом, которая делает это?

Я взял ответ @ NickolayO. Добавил поддержку base-64 с помощью QSStrings и укоротил код с помощью componentsSeparatedByString: и stringByReplacingOccurrencesOfString:withString:

Я сделал код доступным на GitHub . Вот фрагмент для удобства:

 @implementation NSString (MimeEncodedWord) - (BOOL) isMimeEncodedWord { return [self hasPrefix:@"=?"] && [self hasSuffix:@"?="]; } + (NSString*) stringWithMimeEncodedWord:(NSString*)word { // Example: =?iso-8859-1?Q?=A1Hola,_se=F1or!?= NSArray *components = [word componentsSeparatedByString:@"?"]; if (components.count < 5) return nil; NSString *charset = [components objectAtIndex:1]; NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)charset)); // TODO: What happens if the encoding is invalid? NSString *encodingType = [components objectAtIndex:2]; NSString *encodedText = [components objectAtIndex:3]; if ([encodingType isEqualToString:@"Q"]) { // quoted-printable encodedText = [encodedText stringByReplacingOccurrencesOfString:@"_" withString:@" "]; encodedText = [encodedText stringByReplacingOccurrencesOfString:@"=" withString:@"%"]; NSString *decoded = [encodedText stringByReplacingPercentEscapesUsingEncoding:encoding]; return decoded; } else if ([encodingType isEqualToString:@"B"]) { // base64 NSData *data = [QSStrings decodeBase64WithString:encodedText]; NSString *decoded = [[NSString alloc] initWithData:data encoding:encoding]; return decoded; } else { NSLog(@"%@ is not a valid encoding (must be Q or B)", encodingType); return nil; } } @end 

Вот код для версии с кавычками (Mime Encoded-word может быть закодирован-зашифрован или закодирован по базе-64). Для кодирования base64 вы должны сделать аналогичным образом, заменив декодирование с кавычками на печать с помощью base64-декодирования. Вероятно, этот код требует некоторого тестирования. Кроме того, он поддерживает только кодировки NSString.

 - (NSString*) decodeMimeEncodedWord:(NSString*)word { if (![word hasPrefix:@"=?"] || ![word hasSuffix:@"?="]) return nil; int i = 2; while ((i < word.length) && ([word characterAtIndex:i] != (unichar)'?')) i++; if (i >= word.length - 4) return nil; NSString *encodingName = [word substringWithRange:NSMakeRange(2, i - 2)]; NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)encodingName)); // warning! can return 'undefined something' if encodingName is invalid or unknown NSString *encodedString; if ([[word substringWithRange:NSMakeRange(i + 1, 2)] isEqualToString:@"Q?"]) { // quoted-printable encodedString = [word substringWithRange:NSMakeRange(i + 3, word.length - i - 5)]; NSMutableData *binaryString = [[[NSMutableData alloc] initWithLength:encodedString.length] autorelease]; unsigned char *binaryBytes = (unsigned char*)[binaryString mutableBytes]; int j = 0; char h; for (i = 0; i < encodedString.length; i++) { unichar ch = [encodedString characterAtIndex:i]; if (ch == (unichar)'_') binaryBytes[j++] = ' '; else if (ch == (unichar)'=') { if (i >= encodedString.length - 2) return nil; unsigned char val = 0; // high-order hex char h = [encodedString characterAtIndex:++i]; if ((h >= '0') && (h <= '9')) val += ((int)(h - '0')) << 4; else if ((h >= 'A') && (h <= 'F')) val += ((int)(h + 10 - 'A')) << 4; else return nil; // low-order hex char h = [encodedString characterAtIndex:++i]; if ((h >= '0') && (h <= '9')) val += (int)(h - '0'); else if ((h >= 'A') && (h <= 'F')) val += (int)(h + 10 - 'A'); else return nil; binaryBytes[j++] = val; } else if (ch < 256) binaryBytes[j++] = ch; else return nil; } binaryBytes[++j] = 0; [binaryString setLength:j]; NSString *result = [[NSString alloc] initWithCString:[binaryString mutableBytes] encoding:encoding]; // warning! can return 'undefined something' if encoding is invalid or unknown return result; } else if ([[word substringWithRange:NSMakeRange(i + 1, 2)] isEqualToString:@"B?"]) { // base64-encoded return nil; } else return nil; } 
  • Objective-C: #define vs extern const
  • Войдите в OS X, проверьте на iOS и OSStatus -9809
  • Условия разработки для Iphone?
  • Captive Wifi Popup: нажмите ссылку, чтобы открыть Safari
  • Запуск приложения с iOS-инструментами ненадежный
  • Почему мы должны использовать uppercaseStringWithLocale для NSString для получения правильной строки в верхнем регистре?
  • postbuild Сценарий UIAutomation не работает в jenkins
  • Могу ли я сохранить один проект в XCode, но создать его для Mac OS X, Apple Mac Store и устройств iOS?
  • Получение ошибок при установке контейнеров через cocoapods на OS X El Capitan
  • Найти, где объект хранится с помощью ARC
  • Как удалить KVO из слабой собственности?
  • Interesting Posts
    Давайте будем гением компьютера.