在 Swift 3 中,String 有两个初始化器
public init(cString: UnsafePointer<CChar>)
public init(cString: UnsafePointer<UInt8>)
因此,它可以从有符号和无符号字符的(以空结尾的)序列中创建。所以
let s = String(cString: yourCharPointer)
应该可以工作。
String 有另一个初始化器
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
which fails 在格式错误的 UTF-8 序列上而不是替换它们
通过替换字符。这个 init 方法没有对应的
取无符号字符。
以CString.swift中已有的实现为例,添加这个作为扩展并不难:
extension String {
public init?(validatingUTF8 cString: UnsafePointer<UInt8>) {
guard let (s, _) = String.decodeCString(cString, as: UTF8.self,
repairingInvalidCodeUnits: false) else {
return nil
}
self = s
}
}
然后
if let s = String(validatingUTF8: yourCharPointer) {
print(s)
} else {
print("invalid UTF-8")
}
也适用于有符号和无符号字符的(以空结尾的)序列。