c++ - v8 C++ API : pass non-English strings from JavaScript to c++

标签 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("Привет");

我看到“пїЅпїЅпїЅпїЅпїЅпїЅ”而不是字符串。

这段代码有什么问题?

最佳答案

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

此外,您的 V8 版本似乎很旧(例如,如今 HandleScope 构造函数总是采用 Isolate* 参数),因此您也有可能遇到一些已修复的旧错误。

作为引用,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);
}

关于c++ - v8 C++ API : pass non-English strings from JavaScript to c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44427663/

相关文章:

当#include<stack> 和#include<queue> 时,C++ 程序不会编译

c++ - native Node.JS 模块 - 从参数解析 int[]

v8 - v8::Isolate 和 v8::Context 之间到底有什么区别?

c++ - 采用 C++11 的 Google v8 引擎

v8 - 从 V8::Handle<Object> 创建 V8::Persistent<Object> 的正确方法

c++ - Google 的 dense_hash_map 在 set_empty_key() 函数中崩溃

c++ - 使用 cv::videowriter 时视频总是错误的

c++ - 可以在循环之外打破循环吗?

ruby - therubyracer v8 init.so 段错误

javascript - 可选链接 - Function.prototype.apply 在未定义时调用,这是未定义而不是函数