C接口 中文字符问题

06-01 1016阅读

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,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码