php 함수 quoted_printable_decode ()를 nsstring 기반의 Objective-C 함수 / 카테고리 메소드로 변환 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/491678

문제

~ 안에 http://php.net/quoted_printable_decode, 나는 preg_replace를 사용하여 수행하는 방법을 찾았습니다. 일반 NSString을 RFC 2045 섹션 6.7로 변환 할 수있는 코드를 아는 사람이 있습니까?

미리 감사드립니다!

도움이 되었습니까?

해결책

코코아에는 인용 된 인쇄 가능한 문자열을 해독하는 방법이 없지만 다음과 같이 쉽게 무언가를 쓸 수 있습니다.

@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

다른 팁

이 기능을 찾는 다른 사람들을 위해 Jason Coco 's 답은 정말 잘 작동하지만 하나의 중요한 버그가 있습니다. 돌아 오기 전에 UTF8_string의 끝에 널 문자를 추가해야합니다. 그래서 반환 명령문 직전에 라인을 추가하십시오. *ep = '\0'; 그리고 그것은 속임수를해야합니다. 또한 디코딩 된 문자열은 UTF-8과 다른 문자 인코딩을 사용할 수 있기 때문에 NSString 대신 NSDATA 객체를 반환하도록 수정했습니다. 같은 것 return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)]; 잘 작동합니다. 그런 다음 호출 방법은 적절한 인코딩을 사용하여 반환 된 데이터를 NSSTRING으로 다시 채울 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top