0

http://php.net/quoted_printable_decode中,我找到了使用 preg_replace 的方法。谁知道任何可以将普通 NSString 转换为 RFC 2045 第 6.7 节的代码的人?

提前致谢!

4

2 回答 2

1

Cocoa 上没有解码带引号的可打印字符串的方法,但是您可以轻松地自己编写一些东西,例如:

@interface NSString (QuotedPrintableStrings)
+(NSString*)stringWithQuotedPrintableString:(const char *)qpString;
@end

@implementation NSString (QuotedPrintableStrings)

+(NSString*)stringWithQuotedPrintableString:(const char *)qpString
{
    const char *p = qpString;
    char *ep, *utf8_string = malloc(strlen(qpString) * sizeof(char));
    NSParameterAssert( utf8_string );
    ep = utf8_string;

    while( *p ) {
        switch( *p ) {
            case '=':
                NSAssert1( *(p + 1) != 0 && *(p + 2) != 0, @"Malformed QP String: %s", qpString);
                if( *(p + 1) != '\r' ) {
                    int i, byte[2];
                    for( i = 0; i < 2; i++ ) {
                        byte[i] = *(p + i + 1);
                        if( isdigit(byte[i]) )
                            byte[i] -= 0x30;
                        else
                            byte[i] -= 0x37;
                        NSAssert( byte[i] >= 0 && byte[i] < 16, @"bad encoded character");
                    }
                    *(ep++) = (char) (byte[0] << 4) | byte[1];
                }
                p += 3;
                continue;
            default:
                *(ep++) = *(p++);
                continue;
        }
    }
    return [[[NSString alloc] initWithBytesNoCopy:utf8_string length:strlen(utf8_string) encoding:NSUTF8StringEncoding freeWhenDone:YES] autorelease];
}

@end
于 2009-01-30T01:58:18.143 回答
0

对于寻求此功能的其他人,Jason Coco 的答案非常有效,但有一个重要错误。在返回之前,您需要在 utf8_string 的末尾添加一个空字符。因此,就在 return 语句之前,添加该行*ep = '\0';应该可以解决问题。另外,我修改它以返回 NSData 对象而不是 NSString,因为解码后的字符串可能使用与 UTF-8 不同的字符编码。类似的东西return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)];效果很好。然后调用方法可以使用适当的编码将返回的数据填充回 NSString 中。

于 2011-02-15T17:02:02.333 回答