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

Rust cdylib接收C++传入的±字符时panic,如何正确处理?

问题分析

你遇到的panic根源是:C++传递的±字符对应的字节是0xB1(十进制177),这属于Latin-1/Windows-1252这类单字节编码,但Rust的CStr::to_str()要求输入必须是合法的UTF-8编码,解析失败后unwrap()直接触发了panic。

由于你的库仅作为中间件传递字符串,无需操作字符内容,有以下几种高效解决方案:


解决方案

方案一:直接传递原始指针(最优选择)

既然不需要访问字符串内容,完全可以跳过所有字符串转换步骤,直接将C风格指针传递给后续逻辑:

#[no_mangle]
pub extern "C" fn some_function(name: *const c_char, text: *const c_char) {
    // 直接把指针传给下一个需要的C/C++函数即可
    // 示例:call_target_c_function(name, text);
}

方案二:保留CStr类型(需持有字符串时使用)

如果需要在Rust侧临时持有字符串(比如存储后再传递),可以用CStr类型——它仅保证是NUL结尾的C风格字节序列,不会校验UTF-8:

use std::ffi::CStr;

#[no_mangle]
pub extern "C" fn some_function(name: *const c_char, text: *const c_char) {
    unsafe {
        let name = CStr::from_ptr(name);
        let text = CStr::from_ptr(text);
        
        // 后续传递时直接取原始指针:name.as_ptr() / text.as_ptr()
        // 也可以转为OwnedCStr持久化:let stored_text = text.to_owned();
    }
}

方案三:无损转为Rust字符串(仅需查看内容时用)

如果偶尔需要在Rust侧查看字符串内容又不想panic,可以用from_utf8_lossy将无效UTF-8字节替换为�,但此方案不适用于仅传递的场景:

use std::ffi::CStr;

#[no_mangle]
pub extern "C" fn some_function(name: *const c_char, text: *const c_char) {
    unsafe {
        let name_str = String::from_utf8_lossy(CStr::from_ptr(name).to_bytes());
        let text_str = String::from_utf8_lossy(CStr::from_ptr(text).to_bytes());
        
        // 查看内容后,传递仍需使用原始指针:CStr::from_ptr(name).as_ptr()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:12