在 C# 中从 Rust DLL 获取 UTF-8 编码的字符串

val*_*s21 5 c# string dll utf-8 rust

我找到了很多关于 C# 中 Rust DLL 实现的 US-ANSI 字符串的信息,但这并不能解决 UTF-8 编码字符串的任何问题。

\n\n

例如,"Br\xc3\xb6tchen"一旦在 C# 中调用,就会产生"Br\xc3\x83\xc2\xb6tchen".

\n\n

\n\n
use std::os::raw::c_char;\nuse std::ffi::CString;\n\n#[no_mangle]\npub extern fn string_test() -> *mut c_char {\n    let c_to_print = CString::new("Br\xc3\xb6tchen")\n        .expect("CString::new failed!");\n    let r = c_to_print;\n    r.into_raw()  \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

C#

\n\n
[DllImport(@"C:\\Users\\User\\source\\repos\\testlib\\target\\debug\\testlib.dll")]\nprivate static extern IntPtr string_test();\n\npublic static void run()\n{\n    var s = string_test();\n    var res = Marshal.PtrToStringAnsi(s);\n    // var res = Marshal.PtrToStringUni(s);\n    // var res = Marshal.PtrToStringAuto(s);\n    // Are resulting in: ????n\n    Console.WriteLine(res); // prints "Br\xc3\x83\xc2\xb6tchen", expected "Br\xc3\xb6tchen"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我怎样才能得到想要的结果?

\n\n

我不认为这与How can I Transform string to UTF-8 in C#?重复。Marshal.PtrToStringAuto(s)因为它的答案与和的结果相同Marshal.PtrToStringUni(s)

\n

har*_*eyt 3

答案在于使用 Marshal.PtrToStringUTF8,简化,

\n
use std::ffi::CString;\n\n#[no_mangle]\npub extern "C" fn string_test() -> *mut c_char {\n    let s = CString::new("Br\xc3\xb6tchen").expect("CString::new failed!");\n    s.into_raw()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后是C#

\n
[DllImport(RUSTLIB)] static extern IntPtr string_test();\n//...        \nvar encodeText = string_test();\nvar text = Marshal.PtrToStringUTF8(encodeText);\n\nConsole.WriteLine("Decode String : {0}", text);\n
Run Code Online (Sandbox Code Playgroud)\n