我有一个c api,它返回一个以空字符结尾的字符串,该字符串是unsigned char*
类型的数组(对应于UnsafePointer<UInt8>
)。
Swift有初始值设定项String(validatingUTF8:)
,但参数必须是UnsafePointer<CChar>
(a.k.a。UnsafePointer<Int8>
),并且没有简单的方法可以在两者之间进行转换。
如何从这个以null结尾的c-string转换为Swift字符串?
答案 0 :(得分:10)
在Swift 3中,String
有两个初始值设定项
public init(cString: UnsafePointer<CChar>)
public init(cString: UnsafePointer<UInt8>)
因此,它可以从有符号和无符号字符的(以null结尾的)序列创建。所以
let s = String(cString: yourCharPointer)
应该正常工作。
String
有另一个初始化程序
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
在格式错误的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")
}
也适用于有符号和无符号字符的(以null结尾的)序列。