一尘不染

Swift 3:转换以空值结尾的UnsafePointer 到一个字符串

swift

我有一个ac api返回一个以null终止的字符串,该字符串是类型数组unsigned char*(将对应于UnsafePointer<UInt8>)。

Swift具有初始值设定项String(validatingUTF8:),但参数必须为UnsafePointer<CChar>(aka
UnsafePointer<Int8>),并且在两者之间没有简单的转换方法。

如何从以null终止的c字符串转换为Swift字符串?


阅读 215

收藏
2020-07-07

共1个答案

一尘不染

在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>)

失败 上形成不良的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")
}

也适用于有符号和无符号字符的序列(以空终止)。

2020-07-07