我有一个ac api返回一个以null终止的字符串,该字符串是类型数组unsigned char*(将对应于UnsafePointer<UInt8>)。
unsigned char*
UnsafePointer<UInt8>
Swift具有初始值设定项String(validatingUTF8:),但参数必须为UnsafePointer<CChar>(aka UnsafePointer<Int8>),并且在两者之间没有简单的转换方法。
String(validatingUTF8:)
UnsafePointer<CChar>
UnsafePointer<Int8>
如何从以null终止的c字符串转换为Swift字符串?
在Swift 3中,String有两个初始化程序
String
public init(cString: UnsafePointer<CChar>) public init(cString: UnsafePointer<UInt8>)
因此,可以从(空终止)有符号和无符号字符序列创建它。所以
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") }
也适用于有符号和无符号字符的序列(以空终止)。