【问题标题】:How to escape square bracket in NSUserDefaults objective-C如何在 NSUserDefaults Objective-C 中转义方括号
【发布时间】:2020-03-26 10:03:09
【问题描述】:

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

这可行(szServer 包含 1.2.3.4):

./myapp -address "1.2.3.4"

这不起作用(szServer 为零):

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

不幸的是,我不流利地使用 Objective-C,所以这可能是一个微不足道的问题,但是查看 NSUserDefaults documentation 或在互联网上搜索“NSUserDefaults with square bracket”并没有给我带来任何启示(对我来说)主题。

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

    }
}

我也希望能澄清正在发生的事情。

【问题讨论】:

    标签: objective-c nsuserdefaults square-bracket


    【解决方案1】:

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

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

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

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

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

    或者来自这个的字典:

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

    因为在解释这种格式时,各种字符可能是“特殊的”,所以如果字符串中包含任何超出有限集合的字符,则必须用引号引起来。显然,左方括号就是这样一个字符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2019-08-16
      • 2011-08-10
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多