我有以下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/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;
}