Swift 3 从字符串创建 utf8 编码数据的方法

Swift 3 method to create utf8 encoded Data from String

我知道有很多关于 NSData 的 Swift3 之前的问题。我很好奇如何在 Swift3 String 和 utf8 编码(有或没有空终止)到 Swift3 Data 对象之间切换。

到目前为止我想到的最好的是:

let input = "Hello World"
let terminatedData = Data(bytes: Array(input.nulTerminatedUTF8))
let unterminatedData = Data(bytes: Array(input.utf8))

必须进行中间 Array() 构造似乎是错误的。

很简单:

let input = "Hello World"
let data = input.data(using: .utf8)!

如果你想用 null 终止 data,只需 append 一个 0 就可以了。或者您可以致电 cString(using:)

let cString = input.cString(using: .utf8)! // null-terminated
来自 NSFoundation 框架的

NSString 方法应该被放弃,以支持 Swift 标准库等价物。数据可以用任何 Sequence 元素初始化,其中元素是 UInt8String.UTF8View满足这个要求。

let input = "Hello World"
let data = Data(input.utf8)
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]

字符串空终止是C语言的实现细节,不应该外泄。如果您打算使用 C API,请查看 String 类型的 utf8CString 属性:

public var utf8CString: ContiguousArray<CChar> { get }

Data可由CChar转换为UInt8得到:

let input = "Hello World"
let data = Data(input.utf8CString.map { UInt8([=12=]) })
// [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0]