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\nuse 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}\nRun Code Online (Sandbox Code Playgroud)\n\nC#
\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}\nRun 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)。
答案在于使用 Marshal.PtrToStringUTF8,简化,
\nuse 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}\nRun 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);\nRun Code Online (Sandbox Code Playgroud)\n