node.js C++ addons での文字列変換について
nan 等は使わずに V8 API (14.x)向け
共通
windows は _UNICODE
が定義されている必要があります
#define ISOLATE v8::Isolate::GetCurrent()
#if defined(_WIN32)
// windowstypedefwchar_t_char_t;#else
// mac, linuxtypedefchar_char_t;#endif
typedefstd::basic_string<_char_t>_string_t;
v8::Local<v8::String> → std::basic_string
_string_tto_string(constv8::Local<v8::String>&str){#if defined(_WIN32)
// windowsstd::unique_ptr<_char_t[]>buff(new_char_t[str->Length()+1]());str->Write(ISOLATE,(uint16_t*)buff.get(),0,-1,v8::String::NO_NULL_TERMINATION);return_string_t(buff.get());#else
// mac, linuxstd::unique_ptr<_char_t[]>buff(new_char_t[str->Utf8Length(ISOLATE)+1]());str->WriteUtf8(ISOLATE,buff.get(),-1,NULL,v8::String::NO_NULL_TERMINATION);return_string_t(buff.get());#endif
}
std::basic_string → v8::Local<v8::String>
v8::Local<v8::String>to_string(const_string_t&str){#if defined(_WIN32)
// windowsreturnv8::String::NewFromTwoByte(ISOLATE,(uint16_t*)str.c_str()).ToLocalChecked();#else
// mac, linuxreturnv8::String::NewFromUtf8(ISOLATE,str.c_str()).ToLocalChecked();#endif
}