Riesci a tradurre la funzione php quoted_printable_decode () in un metodo di categoria / funzione obiettivo-C basato su NSString?
-
20-08-2019 - |
Domanda
In http://php.net/quoted_printable_decode , ho trovato il modo di farlo usando preg_replace. Chiunque conosca un codice che potrebbe convertire un normale NSString in qualcosa RFC 2045 sezione 6.7?
Grazie in anticipo!
Soluzione
Non c'è alcun metodo su Cocoa per decodificare una stringa stampabile tra virgolette, ma potresti facilmente scrivere qualcosa tu stesso, come:
@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
Altri suggerimenti
Per gli altri che cercano questa funzionalità, La risposta di Jason Coco funziona davvero bene, ma ha un bug importante. È necessario aggiungere un carattere null alla fine di utf8_string prima di tornare. Quindi, appena prima dell'istruzione return, aggiungi la riga *ep = '\0';
e questo dovrebbe fare il trucco. Inoltre, l'ho modificato per restituire un oggetto NSData anziché un NSString, poiché la stringa decodificata potrebbe utilizzare una codifica di caratteri diversa da UTF-8. Qualcosa come return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)];
funziona bene. Quindi il metodo chiamante può occuparsi di reinserire i dati restituiti in un NSString usando la codifica appropriata.