C接口 中文字符问题
C接口 中文字符问题
- 1. C接口字符串传递
- 2. 示例代码
- 2.1. 基本C接口字符传递(不支持中文)
- 2.2. C接口中文字符传递(支持中文)
1. C接口字符串传递
在使用 C/C++ 编写 DLL 并通过 C# 调用时,常见的跨语言字符串传递方式是通过 const char*。但在涉及中文路径或文件名等含有非 ASCII 字符的情况时,如果编码方式处理不当,可能会出现乱码或崩溃问题。
本篇文章将详细讲解如何通过 const char* 实现 UTF-8 编码的中文字符传递,适配中英文路径,并在 C# 和 C++ 之间安全传参。
主要问题汇总:
问题 错误做法 正确做法 中文乱码 直接传 string / char* 使用 UTF-8 编码 + 手动传递 IntPtr 编码不统一 使用默认编码(如 ANSI) 明确使用 UTF-8 编码 控制台乱码 默认编码输出中文 设置 SetConsoleOutputCP(CP_UTF8) 2. 示例代码
2.1. 基本C接口字符传递(不支持中文)
以char*作为字符串之间的传递
#define DLL_EXPORT __declspec(dllexport) #define DLL_IMPORT __declspec(dllimport) extern "C" { DLL_EXPORT int SetFile(const char* filePath) { std::cout DLL_EXPORT int SetFile(const char* filePath) { std::string utf8_path(stpPath); std::cout // 指定调用约定和 ANSI 编码,但我们传入的是 UTF-8 字节,所以用 IntPtr 更安全 [DllImport("YourDll.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int SetFile(IntPtr filePath); static void Main() { string filePath = "C:\\测试\\文件.txt"; // 编码为 UTF-8 字节数组(带末尾 null 终止符) byte[] utf8Bytes = Encoding.UTF8.GetBytes(filePath + "\0"); // 分配非托管内存 IntPtr unmanagedPtr = Marshal.AllocHGlobal(utf8Bytes.Length); try { Marshal.Copy(utf8Bytes, 0, unmanagedPtr, utf8Bytes.Length); // 调用 C 接口 SetFile(unmanagedPtr); } finally { Marshal.FreeHGlobal(unmanagedPtr); // 释放内存 } } }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。