当前位置: 首页 > news >正文

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 << "filePath:" << filePath << std::endl;
}
} // extern "C"

2.2. C接口中文字符传递(支持中文)

为了支持中文字符,我们需要:

  • 保证 C# 传入的是 UTF-8 编码的字节流
  • 在 C++ 端以 UTF-8 的方式接收和处理
#define DLL_EXPORT __declspec(dllexport)
#define DLL_IMPORT __declspec(dllimport)extern "C" {
DLL_EXPORT int SetFile(const char* filePath) {std::string utf8_path(stpPath);std::cout << "filePath:" << utf8_path<< std::endl;
}
} // extern "C"

C#端调用示例

using System;
using System.Text;
using System.Runtime.InteropServices;class Program
{// 指定调用约定和 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); // 释放内存}}
}

✅ 说明:

  • 使用 Encoding.UTF8.GetBytes() 确保传入的是 UTF-8 编码。
  • 自行添加 \0 终止符,防止 C++ 接口访问越界。
  • 使用 IntPtr 而不是 string,避免编码转换的干扰。
http://www.xdnf.cn/news/688897.html

相关文章:

  • 针对C++开发工具推荐及分析(涵盖IDE、编译器、调试工具和辅助工具)
  • 电脑开机后出现bootmgr is conmpressed原因及解决方法
  • 【Redis】基本架构
  • Dockerfile 构建优化的方法
  • 智变与重构:AI 赋能基础教育教学的范式转型研究报告
  • 理解 Vue 2 的响应式原理:数据劫持与依赖收集的背后
  • 第八天:面向对象编程
  • React---day3
  • CVE-2017-12629-XXE源码分析与漏洞复现
  • 设计模式24——访问者模式
  • 【AUTOSAR OS】 保护功能解析:从原理到应用与源代码解析(下篇)
  • 《Python+AI如何颠覆传统文书审查模式》
  • 【网络安全】——Modbus协议详解:工业通信的“通用语言”
  • JS 逆向太费劲,试试 JS 注入!
  • 服务器上用脚本跑python深度学习的注意事项(ubantu系统)
  • 【第2章 绘制】2.6 阴影
  • 基于stm32LORA无线抄表系统仿真
  • 人工智能在智能建筑中的创新应用与未来趋势
  • 将docker容器保存为镜像,让后将镜像打包保存到本地
  • WPF的基础控件:布局控件(StackPanel DockPanel)
  • React+Antd全局加载遮罩工具
  • 2. 数据结构基本概念 (2)
  • LLM 对齐新范式:深入解析 DPO (Direct Preference Optimization) 的原理与实践
  • Microsoft的在word中选择文档中的所有表格进行字体和格式的调整时的解决方案
  • 180 度 = π 弧度
  • 2025吉林ccpc【部分题解】
  • c++第三天(对象与构造函数)
  • ICDMC 2025:创新媒体模式,迎接数字时代的挑战
  • Redission学习专栏(一):快速入门及核心API实践
  • CORS跨域资源共享解析