v8 C ++ Api:将非英语字符串从JavaScript传递给c ++

时间:2017-06-08 05:56:14

标签: c++ v8 embedded-v8

在我的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 个答案:

答案 0 :(得分:1)

代码看起来是正确的,因此@xaxxon建议,我要仔细检查您用于输出的终端是否可以处理非ASCII字符,并且输入文件(如果有)是正确编码的。

此外,您的V8版本看起来很旧(例如HandleScope构造函数这些天总是带Isolate*参数),所以您也可能遇到这种情况一些已经修复的旧bug。

作为参考,official sample shell几乎以相同的方式完成任务,并且在我的机器上至少可以正常使用您的测试字符串:

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);
}