【问题标题】:Swift 3: convert a null-terminated UnsafePointer<UInt8> to a stringSwift 3:将以 null 结尾的 UnsafePointer<UInt8> 转换为字符串
【发布时间】:2016-09-19 04:59:51
【问题描述】:

我有一个 c api,它返回一个以 null 结尾的字符串,该字符串是 unsigned char* 类型的数组(对应于 UnsafePointer&lt;UInt8&gt;)。

Swift 有初始化器String(validatingUTF8:),但参数必须是UnsafePointer&lt;CChar&gt;(又名UnsafePointer&lt;Int8&gt;),并且没有简单的方法可以在两者之间进行转换。

如何从这个以 null 结尾的 c 字符串转换为 Swift 字符串?

【问题讨论】:

    标签: swift string


    【解决方案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>)
    

    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")
    }
    

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

    【讨论】:

    • 知道了。它没有出现在我的自动完成中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多