You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NAPI封装C++时返回非英文字符出现乱码的解决问询

解决NAPI返回非英文字符乱码问题

问题核心

C++字符串字面量的编码由源文件编码和编译器设置决定,若传递给NAPI的不是UTF-8编码的字节流,JS端解析时就会出现乱码。此外原代码存在笔误(返回未定义的patientName变量),需先修正。

具体解决方案

1. 统一编码环境

  • 将C++源文件保存为UTF-8无BOM编码。
  • 编译时添加强制UTF-8处理参数:
    • GCC/Clang:添加 -finput-charset=UTF-8 -fexec-charset=UTF-8
    • MSVC:添加 /utf-8

2. 修正代码笔误并确保字符串UTF-8格式

修改NAPI端代码,修正返回变量的错误,并直接返回UTF-8编码字符串:

#include <iostream>
#include "wrapper.h"

Napi::Value wrapper::getNameWrapper(const Napi::CallbackInfo &info)
{
    Napi::Env env = info.Env();
    std::string dcmFilePath = info[0].As<Napi::String>().Utf8Value();
    // 修正笔误:返回定义好的name变量
    Napi::String name = Napi::String::New(env, wrapper::getName(dcmFilePath));
    return name;
}

std::string wrapper::getName(std::string dcmFilePath)
{
    // 源文件为UTF-8时,直接返回字面量即可
    return "김한춘";
}

Napi::Object wrapper::Init(Napi::Env env, Napi::Object exports)
{
    exports.Set("getName", Napi::Function::New(env, wrapper::getNameWrapper));
    return exports;
}

3. 宽字符串转UTF-8(兼容非UTF-8源文件场景)

若无法保证源文件编码,可通过宽字符串转UTF-8的方式处理:

#include <string>
#include <codecvt>
#include <locale>

// 宽字符串转UTF-8工具函数
std::string wstring_to_utf8(const std::wstring& wstr) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    return converter.to_bytes(wstr);
}

std::string wrapper::getName(std::string dcmFilePath)
{
    std::wstring wname = L"김한춘";
    return wstring_to_utf8(wname);
}

注:C++17中std::codecvt_utf8已被弃用,可改用第三方库(如utf8cpp)或自行实现转换逻辑。

4. JS端验证

现代终端默认支持UTF-8编码,无需修改JS代码,直接运行即可正常显示非英文字符。


内容的提问来源于stack exchange,提问作者CRESENS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:10:25