php 함수 quoted_printable_decode ()를 nsstring 기반의 Objective-C 함수 / 카테고리 메소드로 변환 할 수 있습니까?
-
20-08-2019 - |
문제
~ 안에 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으로 다시 채울 수 있습니다.
제휴하지 않습니다 StackOverflow