http://php.net/quoted_printable_decodeで、preg_replaceを使用してそれを行う方法を見つけました。通常のNSStringをRFC2045セクション6.7に変換できるコードを知っている人はいますか?
前もって感謝します!
http://php.net/quoted_printable_decodeで、preg_replaceを使用してそれを行う方法を見つけました。通常のNSStringをRFC2045セクション6.7に変換できるコードを知っている人はいますか?
前もって感謝します!
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
この機能を探している他の人にとっては、Jason Coco の回答は非常にうまく機能しますが、重要なバグが 1 つあります。戻る前に、utf8_string の最後にヌル文字を追加する必要があります。したがって、return ステートメントの直前に行*ep = '\0';
を追加すると、うまくいくはずです。また、デコードされた文字列は UTF-8 とは異なる文字エンコーディングを使用する可能性があるため、NSString ではなく NSData オブジェクトを返すように変更しました。のようなものがreturn [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)];
うまくいきます。その後、呼び出し元のメソッドは、適切なエンコーディングを使用して、返されたデータを NSString に詰め込むことができます。