【发布时间】:2017-06-15 14:38:39
【问题描述】:
将字节转换为字符串是很常见的......
import Foundation
var data = Data(bytes: [65,66,67,0,0,0,0,0,0])
let str0 = String(bytes: data, encoding: .utf8)
let str1 = data.withUnsafeBytes { (p: UnsafePointer<CChar>)->String? in
return String(cString: p, encoding: .utf8)
}
比较字符串
print(str0 == str1) // false ??????????
对我来说有点意外。
下一个sn-p解释,为什么字符串不一样
print(str0 as Any, str0 ?? "", str0?.characters.count as Any)
print(str1 as Any, str1 ?? "", str1?.characters.count as Any)
打印出来
Optional("ABC\0\0\0\0\0\0") ABC Optional(9)
Optional("ABC") ABC Optional(3)
这是预期的行为吗?
一见钟情,我就明白了 Rob 的回答,但是……
let str2 = data.withUnsafeBytes { (p: UnsafePointer<Int8>)->String? in
return String(utf8String: p)
}
给了我 3 个字符的长字符串。是的,我知道 CChar 是 Int8 的类型别名,但这是否意味着 p 自动代表 CString?
最后,我在 IBM Sandbox 中检查了相同的 http://swift.sandbox.bluemix.net/#/repl/5942a7d7c0be7f183ad81525
在这两种情况下,生成的字符串都是相同的,只有 3 个字符。
【问题讨论】: