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);
}
Другие вопросы по тегам