使用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”?
答案 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中的生命周期。