在Swift中使用放置持有者本地化String

时间:2017-08-03 19:44:06

标签: swift string localization

使用Swift 3,部署目标iOS 9或10.在两者上进行测试。

为什么:

    let s = "8 août 2017" 
    let sUtf8 = (s as NSString).utf8String!
    let template = "%1$s"
    let s1 = String(format: template, arguments: [sUtf8])
    NSLog(s1)
    let s2 = String.localizedStringWithFormat(template,((s as NSString).utf8String)!)
    NSLog(s2)

log“8ao√ªt2017”而不是“8août2017”?

1 个答案:

答案 0 :(得分:2)

请查看Apple的String Format Specifiers文档。

  

.apply()以空字符结尾的8位无符号字符数组。因为了   %s说明符会导致在系统中解释字符   默认编码,结果可以是变量,尤其是   从右到左的语言。例如,使用RTL,%s插入方向   字符不是强烈方向时的标记。为了这   原因是,最好避免使用%s并明确指定编码。

(添加了大胆的风格。)

无法保证传递的字节序列被解释为UTF-8。

%s的UTF-8字节序列(十六进制):

"8 août 2017"

如果设备的默认编码设置为ISO-Latin1,则字节解释为:

(系统默认编码在用户设备中可能有所不同。)

38 20 61 6f c3 bb 74 20 32 30 31 37

通常有用的指南:永远不要在Swift代码中使用8 a o √ ª t 2 0 1 7

在Swift代码中,请改用%s。 (我建议尽可能在Objective-C中使用%@。)

%@

您无需使用丑陋且有风险的(*)let s = "8 août 2017" let template = "%1$@" let s1 = String(format: template, s) NSLog(s1) //->8 août 2017 let s2 = String.localizedStringWithFormat(template, s) NSLog(s2) //->8 août 2017

(*)(s as NSString).utf8String的C字符串区域的生命周期可能比字符串对象短。而且,在Swift中,字符串对象的生命周期可能远远短于Objective-C中的生命周期。