Objective-C中的Mime编码的Word解析 [英] Mime Encoded-Word parsing in Objective-C

查看:186
本文介绍了Objective-C中的Mime编码的Word解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

OS X或iOS提供API来解析 MIME Encoded-Word ?这些可爱的字符串:

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

或者,是否有一个已知的开源库?

解决方案

我拿了@ NickolayO的 answer ,添加了基础64支持与 QSStrings ,并缩短代码使用 componentsSeparatedByString: stringByReplacingOccurrencesOfString:withString:



我已将代码提供给 GitHub 。这是一个方便的代码片段:

  @implementation NSString(MimeEncodedWord)

- (BOOL)isMimeEncodedWord
{
return [self hasPrefix:@=?]&& [self hasSuffix:@?=];
}

+(NSString *)stringWithMimeEncodedWord:(NSString *)word
{//示例:=?iso-8859-1?Q?= A1Hola,_se = !?=
NSArray * components = [word componentsSeparatedByString:@?];
if(components.count< 5)return nil;

NSString * charset = [components objectAtIndex:1];
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)charset)); // TODO:如果编码无效,会发生什么?

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];
返回解码;
} else if([encodingType isEqualToString:@B])
{// base64
NSData * data = [QSStrings decodeBase64WithString:encodedText];
NSString * decoded = [[NSString alloc] initWithData:data encoding:encoding];
返回解码;
} else {
NSLog(@%@不是有效的编码(必须是Q或B),encodingType);
return nil;
}
}

@end


Do OS X or iOS provide an API to parse MIME Encoded-Word? These lovely strings:

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

Alternatively, is there a known open-source library that does this?

解决方案

I took @NickolayO.'s answer, added base-64 support with QSStrings and shortened the code by using componentsSeparatedByString: and stringByReplacingOccurrencesOfString:withString:.

I've made the code available on GitHub. Here's a snippet for convenience:

@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

这篇关于Objective-C中的Mime编码的Word解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆