Penso che in casi come questi, è utile operare su un personaggio alla volta, in UniChar o UTF8 byte. Se stai usando UTF-8, allora vis(3)
farà la maggior parte del lavoro per te (vedi sotto). Posso chiederti perché vuoi evadere da una virgoletta singola all'interno di una stringa doppia citazione? Come pensate di gestire i caratteri multi-byte? Nell'esempio seguente, sto usando UTF-8, codificando caratteri a 8 bit usando gli escape ottali C-Style. Questo può anche essere annullato da unvis(3)
.
#import <Foundation/Foundation.h>
#import <vis.h>
@interface NSString (Escaping)
- (NSString *)stringByEscapingMetacharacters;
@end
@implementation NSString (Escaping)
- (NSString *)stringByEscapingMetacharacters
{
const char *UTF8Input = [self UTF8String];
char *UTF8Output = [[NSMutableData dataWithLength:strlen(UTF8Input) * 4 + 1 /* Worst case */] mutableBytes];
char ch, *och = UTF8Output;
while ((ch = *UTF8Input++))
if (ch == '\'' || ch == '\'' || ch == '\\' || ch == '"')
{
*och++ = '\\';
*och++ = ch;
}
else if (isascii(ch))
och = vis(och, ch, VIS_NL | VIS_TAB | VIS_CSTYLE, *UTF8Input);
else
och+= sprintf(och, "\\%03hho", ch);
return [NSString stringWithUTF8String:UTF8Output];
}
@end
int
main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSLog(@"%@", [@"I said \"Hello, world!\".\nHe said \"My name's not World.\"" stringByEscapingMetacharacters]);
[pool drain];
return 0;
}
fonte
2010-11-04 05:23:46
certamente non utilizzare manualmente che il metodo più e più volte.Non sarebbe difficile scrivere un metodo che prende una serie di sostituzioni tutte in una volta. – Chuck