yewanji 2024-02-02 23:12 采纳率: 34.2%
浏览 87
已结题

nodejs 通过ffi 调用c++ 接口乱码问题

问题是这样的,c++ 运行的时候是采用gbk 格式的,nodejs 运行的时候,是以utf-8 模式的,当我使用nodejs 调用c++ 会出现乱码,具体代码如下

  var ffi = require('ffi-napi');
  var ref = require('ref-napi')
  const StructType = require('ref-struct-napi');
 //构造一个结构体
  const WpsResult = StructType({
    status: ffi.types.bool,
    message: ffi.types.CString,
  })

  const dllLib = ffi.Library(dllPath, {
    'pollWpsResult': [WpsResult, []]
  });
  //执行调用
  const result = dllLib.pollWpsResult();
 //打印出来的result.message 是乱码的

c++ 代码如下

struct WpsResult
{
    bool status;
    const char* message;

    WpsResult() {
        this->status = false;
        //this->setMessage("正在初始化");
        cout << "初始化" << this->status << "\n";
        this->message = "tPK/qs7EtbXKp7Dco6zH67zssunOxLz+uPHKvQ==";
    }
};
//导出的接口,给nodejs 调用的
EXPORT WpsResult* pollWpsResult()
{
    WpsResult result{};
    return &result;
}

备注:此问题求有相关经验的同学解决,gpt是无法解决的,一味从gpt复制粘贴的朋友不用回答了,在此谢过~

  • 写回答

11条回答 默认 最新

  • 檀越@新空间 2024-02-02 23:12
    关注

    yewanji 晚上好🌙🌙🌙
    本答案参考ChatGPT3.5

    乱码问题是因为C++使用的是GBK编码,而Node.js使用的是UTF-8编码。为了解决这个问题,你可以尝试以下几种方法:

    1. 将C++代码中的字符串编码方式改为UTF-8,以保持与Node.js的编码方式一致。这样在调用C++接口时就不会出现乱码问题了。

    2. 在Node.js中使用iconv-lite等库将C++返回的GBK编码字符串转换为UTF-8编码。这样可以保持Node.js内部的编码方式不变,同时将C++返回的字符串转换为正确的编码。

    3. 在C++代码中使用WideCharToMultiByte等函数将GBK编码的字符串转换为UTF-8编码。然后在Node.js中使用Buffer.from方法将转换后的字符串转换为Buffer对象,再使用toString方法将Buffer对象转换为UTF-8编码的字符串。

    下面是针对第二种方法的示例代码:

    var ffi = require('ffi-napi');
    var ref = require('ref-napi');
    const StructType = require('ref-struct-napi');
    const iconv = require('iconv-lite');
    
    // 构造一个结构体
    const WpsResult = StructType({
      status: ffi.types.bool,
      message: ffi.types.CString,
    });
    
    const dllLib = ffi.Library(dllPath, {
      'pollWpsResult': [WpsResult, []]
    });
    
    // 执行调用
    const result = dllLib.pollWpsResult();
    
    // 将GBK编码的字符串转换为UTF-8编码
    const utf8Message = iconv.decode(Buffer.from(result.message, 'binary'), 'gbk');
    
    console.log(utf8Message);
    

    请注意,上述代码中使用了iconv-lite库来进行编码转换。你需要先使用npm安装该库:npm install iconv-lite

    希望以上解决方案对你有帮助。如果还有其他问题,请随时提问。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月4日
  • 修改了问题 2月2日
  • 创建了问题 2月2日