Можете ли вы перевести php-функцию quoted_printable_decode () в метод / категорию-цель-C на основе NSString? - PullRequest
0 голосов
/ 29 января 2009

В http://php.net/quoted_printable_decode, Я нашел способы сделать это, используя preg_replace. Любой, кто знает любой код, который может преобразовать обычную строку NSString во что-то RFC 2045, раздел 6.7?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2009

На Какао нет способа декодировать цитируемую строку для печати, но вы можете легко написать что-то самостоятельно, например:

@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
0 голосов
/ 15 февраля 2011

Для тех, кто ищет эту функцию, ответ Джейсона Коко работает очень хорошо, но имеет одну важную ошибку. Вам нужно добавить нулевой символ в конец строки utf8_string перед возвратом. Поэтому перед оператором return добавьте строку *ep = '\0';, и это должно помочь. Кроме того, я изменил его, чтобы он возвращал объект NSData, а не строку NSString, поскольку декодированная строка может использовать кодировку символов, отличную от UTF-8. Что-то вроде return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)]; работает хорошо. Затем вызывающий метод может позаботиться о вставке возвращенных данных обратно в строку NSString, используя соответствующую кодировку.

...