ROT13 encode/decode 字符串但不要更改括号 [] 内的字符

ROT13 encode/decode string but don't change characters within brackets []

我有一个简单的 ROT13 方法可以对字符串进行编码或解码。

+ (NSString *)ROT13encodeString:(NSString *)aString {

    if (!aString) {
        return nil;
    }

    // Find text between brackets
    NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
    NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];
    // ???

    NSString *newString;
    unsigned length;
    unichar *buf;
    unsigned i;

    length = [aString length];
    buf = malloc( (length + 1) * sizeof(unichar) );
    [aString getCharacters:buf];
    buf[length] = (unichar)0; // not really needed....
    for (i = 0; i < length; i++) {
        if (buf[i] >= (unichar)'a' && buf[i] <= (unichar) 'z') {
            buf[i] += 13;
            if (buf[i] > 'z') buf[i] -= 26;
        } else if (buf[i] >= (unichar)'A' && buf[i] <= (unichar) 'Z') {
            buf[i] += 13;
            if (buf[i] > 'Z') buf[i] -= 26;
        }
    }
    newString = [NSString stringWithCharacters:buf length:length];
    free(buf);
    return newString;

}

但是,在要编码的文本中,有 "safe" 个单词放在方括号 [] 中。永远不要对包括括号在内的单词进行编码,它们始终需要处于非编码状态。

我想我可以找出所有出现在括号内的文本,但不确定它有什么帮助:

NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];

我怎样才能修改我当前的方法来包含这个?

我没有在 objective-c 中编码,但我认为这应该很接近:

+ (NSString *)ROT13encodeString:(NSString *)aString {

    if (!aString) {
        return nil;
    }

    // Find text between brackets
    NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
    NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];
    // ???

    NSString *newString;
    unsigned length;
    unichar *buf;
    unsigned i;
    unsigned level;

    length = [aString length];
    buf = malloc( (length + 1) * sizeof(unichar) );
    [aString getCharacters:buf];
    buf[length] = (unichar)0; // not really needed....
    level = 0;
    for (i = 0; i < length; i++) {
        if (buf[i] == (unichar)'[') {
          level++;
        } else if (buf[i] == (unichar)']') {
          level--;
        } else if (level==0 && buf[i] >= (unichar)'a' && buf[i] <= (unichar) 'z') {
            buf[i] += 13;
            if (buf[i] > 'z') buf[i] -= 26;
        } else if (level==0 && buf[i] >= (unichar)'A' && buf[i] <= (unichar) 'Z') {
            buf[i] += 13;
            if (buf[i] > 'Z') buf[i] -= 26;
        }
    }
    newString = [NSString stringWithCharacters:buf length:length];
    free(buf);
    return newString;

}