You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中将CFStringRef转换为String?

将CFStringRef转换为Rust String的方法

要把core_foundation::string::CFStringRef转换成std::string::String,可以借助core-foundation crate提供的封装方法,步骤如下:

依赖准备

确保你的Cargo.toml中添加了对应版本的依赖:

[dependencies]
core-foundation = "0.9.4"

转换实现

CFStringRef本质是指向CFString的原始指针,需要通过unsafe块处理内存安全,核心是利用CFString的包装方法和转换函数:

安全转换(兼容非UTF-8内容)

这个方法会检查CFString的编码合法性,转换失败时返回None:

use core_foundation::string::{CFString, CFStringRef};
use std::string::String;

fn cfstring_to_string(cf_str: CFStringRef) -> Option<String> {
    unsafe {
        // 按Core Foundation的get规则包装指针,无需手动释放
        let cf_string = CFString::wrap_under_get_rule(cf_str);
        cf_string.to_string()
    }
}

无检查转换(已知内容为UTF-8时使用)

如果能确定CFString的内容是合法UTF-8,可以用unsafe的无检查转换,跳过错误分支:

use core_foundation::string::{CFString, CFStringRef};
use std::string::String;

unsafe fn cfstring_to_string_unchecked(cf_str: CFStringRef) -> String {
    let cf_string = CFString::wrap_under_get_rule(cf_str);
    cf_string.to_string_unchecked()
}

内存管理注意

  • wrap_under_get_rule遵循Core Foundation的get规则:如果CFStringRef是通过带Get/Copy前缀的API获取的,无需手动调用CFRelease释放;如果是通过Create前缀API创建的,你需要自行负责释放原指针。

内容的提问来源于stack exchange,提问作者JKortmann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:35:10