v8 C++ Api: передавать неанглийские строки из JavaScript в C++
В моем коде C++ у меня есть:
Handle<ObjectTemplate> globalTemplate = ObjectTemplate::New();
globalTemplate->Set( String::New("print"), FunctionTemplate::New( printMessage ));
Handle<Context> context = Context::New( NULL, globalTemplate );
Функция printMessage определяется как:
Handle<Value> printMessage(const Arguments& args)
{
Locker locker;
HandleScope scope;
if( args.Length() )
{
String::Utf8Value message( args[0]->ToString() );
if( message.length() )
{
//Print the message to stdout
printf( "%s", *message );
bool newline = true;
if(args.Length() == 2)
{
newline = args[1]->ToBoolean()->BooleanValue();
}
if(newline) printf("\n");
return scope.Close( Boolean::New( true ) );
}
}
return Undefined();
}
когда я вызываю эту функцию из JavaScript:
print("Привет");
Я вижу "строку" вместо строки.
Что не так с этим кодом?
1 ответ
Код выглядит правильно, поэтому, как предложил @xaxxon, я бы дважды проверил, что терминал, который вы используете для вывода, может работать с не-ASCII-символами, и что входной файл (если есть) кодируется правильно.
Кроме того, ваши версии V8, кажется, довольно старые (например, HandleScope
Конструктор всегда занимает Isolate*
в эти дни), поэтому также возможно, что вы столкнулись с какой-то старой ошибкой, которая с тех пор была исправлена.
Для справки, официальный пример оболочки работает почти так же, и на моем компьютере, по крайней мере, отлично работает с вашей тестовой строкой:
void Print(const v8::FunctionCallbackInfo<v8::Value>& args) {
bool first = true;
for (int i = 0; i < args.Length(); i++) {
v8::HandleScope handle_scope(args.GetIsolate());
if (first) {
first = false;
} else {
printf(" ");
}
v8::String::Utf8Value str(args[i]);
const char* cstr = ToCString(str);
printf("%s", cstr);
}
printf("\n");
fflush(stdout);
}