如何在Node.js N-API中处理C++ wstring?
Node.js N-API与C++ std::wstring的处理方案
Node.js的node-addon-api(N-API的C++封装)不直接支持std::wstring类型,也没有提供Napi::WString这类原生封装——这是因为Node.js内部字符串统一采用UTF-8编码存储,而std::wstring在Windows平台通常对应UTF-16编码,两者编码体系存在差异。
在Windows API场景下,通常通过编码转换实现std::wstring与Napi::String的双向交互,以下是两种核心场景的常规处理方式:
1. 将Windows API返回的std::wstring转为Napi::String
需要把UTF-16编码的std::wstring转换为UTF-8编码的字符串,再通过Napi::String::New创建Node.js可识别的字符串对象。推荐使用Windows原生APIWideCharToMultiByte实现(避免C++标准库的兼容性问题):
#include <windows.h> #include <string> #include <napi.h> Napi::String WStringToNapiString(const Napi::Env& env, const std::wstring& wstr) { // 计算UTF-8字符串所需长度 int utf8Length = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr); std::string utf8Str(utf8Length, 0); // 执行编码转换 WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &utf8Str[0], utf8Length, nullptr, nullptr); // 移除自动添加的null终止符 utf8Str.pop_back(); return Napi::String::New(env, utf8Str); }
2. 将Napi::String转为std::wstring供Windows API使用
先把Napi::String导出为UTF-8编码的std::string,再通过MultiByteToWideChar转换为UTF-16编码的std::wstring:
#include <windows.h> #include <string> #include <napi.h> std::wstring NapiStringToWString(const Napi::String& napiStr) { // 获取Node.js字符串的UTF-8内容 std::string utf8Str = napiStr.Utf8Value(); // 计算UTF-16字符串所需长度 int utf16Length = MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, nullptr, 0); std::wstring wstr(utf16Length, 0); // 执行编码转换 MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, &wstr[0], utf16Length); // 移除自动添加的null终止符 wstr.pop_back(); return wstr; }
注意事项
- 避免使用C标准库的
std::wstring_convert:该工具在C17及以后版本已被标记为废弃,跨版本兼容性较差; - 编码转换时务必指定
CP_UTF8代码页,保证转换后的字符串与Node.js的UTF-8模型一致,避免乱码; - 所有与Node.js交互的字符串必须经过编码转换,直接传递
wstring会导致内存错误或编码混乱。
内容的提问来源于stack exchange,提问作者Shane Gannon
相关产品推荐
相关产品推荐

