在我的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("Привет");
我看到“пїЅпїЅпїЅпїЅпїЅпїЅ”而不是字符串。
这段代码出了什么问题?
答案 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);
}