如何在 NSUserDefaults objective-C 中转义方括号

How to escape square bracket in NSUserDefaults objective-C

使用以下代码提取参数时,它在大多数情况下都能正常工作,但不适用于 IPv6 格式。乍一看,似乎与 [] 字符有关,我猜这些字符对解析有特殊意义:

有效(szServer 包含 1.2.3.4):

./myapp -address "1.2.3.4"

这不起作用(szServer 为 nil):

./myapp -address "[2001::abc]"

不幸的是,我在 objective-C 方面并不流利,所以这可能是一个微不足道的问题,但是查看 NSUserDefaults documentation or searching on internet "NSUserDefaults with square bracket”并没有给我带来任何启发主题。

int main(int argc, char *argv[])
{
    @autoreleasepool {
        NSUserDefaults *args = [NSUserDefaults standardUserDefaults];
        NSString * szServer = [args stringForKey:@"address"];

    }
}

我也希望对正在发生的事情做出一些澄清。

如果您在论点中引用引号,它会起作用:

./myapp -address '"[2001::abc]"'

对于命令行 -<key> <value> 选项,该值被解释为旧式(NextStep 时代)属性 列表,而不仅仅是逐字字符串。

例如,这意味着可以通过这种方式传递数组和字典。如果您将代码更改为使用 objectForKey: 而不是 stringForKey:,它将收到一个数组:

./myapp -address '("[2001::abc]")'

或字典来自:

./myapp -address '{address="[2001::abc]";}'

因为在解释这种格式时各种字符可以是 "special",所以如果字符串中包含超出限制集的任何字符,则必须用引号引起来。看样子,左方括号就是这样一个字符。

如果您需要弄清楚用于给定参数的语法,您可以编写一个简单的程序,该程序构造一个数组,其中包含所需的 属性 列表对象,并记录该数组。显然,结果将包括用于格式化数组的括号,但数组中的对象也将根据这种旧式格式的需要进行格式化。 (如果你没有像数组一样将对象包装在集合中,那么它可能只是逐字地写自己,就像记录 NSString 时一样。)