使用希伯来字符从 Rust 调用 c 函数

问题描述 投票:0回答:1

我有以下c库:

#include <cstdio>

extern "C" void print_name(const char *name) {
    printf("C name %s\n", name);
}

我有以下 Rust 代码,用希伯来字符调用它:

extern "C" {
    fn print_name(name: *const ::std::os::raw::c_char);
}

fn main() {
    let name = "עברית";
    println!("Rust name: {}", name);
    let c_name = std::ffi::CString::new(name).unwrap();
    unsafe {
        print_name(c_name.as_ptr());
    }
}

我编译它:

"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\Hostx64\x64\cl" /c /EHsc /MD /O2 /DNDEBUG lib.cpp
"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\Hostx64\x64\lib" lib.obj /OUT:lib.lib
rustc main.rs -l lib -L .

然后从 Powershell 运行它:

$ .\main.exe    
Rust name: עברית
C name עברית

如您所见,rust 正确打印了它,但 c 函数打印它已损坏。 我想知道如何修复它,以及修复此类编码问题背后的理论是什么,因为我在另一个更大的项目中遇到了这个问题,并且我在许多其他项目中遇到了它。 谢谢!

c rust encoding ffi
1个回答
0
投票

嗯,您必须设置正确的语言环境才能在 C/C++ 中实现此目的。如果您在 Windows 中,您可以执行以下操作

#include <cstdio>
#include <Windows.h>

extern "C" void print_name(const char *name);

extern "C" void print_name(const char *name) {
    printf("C name %s\n", name);
}

int main() { 
    SetConsoleOutputCP(CP_UTF8);
    const char *name = "עברית";
    print_name(name);
    return 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.