2017-06-08 3 views
0

In meiner C++ Code, den ich habe:v8 C++ Api: pass nicht-englische Zeichenketten von JavaScript zu C++

Handle<ObjectTemplate> globalTemplate = ObjectTemplate::New(); 
globalTemplate->Set(String::New("print"), FunctionTemplate::New(printMessage)); 
Handle<Context> context = Context::New(NULL, globalTemplate); 

Die Printmessage-Funktion ist definiert als:

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

, wenn ich diese Funktion aufrufen aus JavaScript:

print("Привет"); 

Ich sehe "пїЅпїЅпїЅпїЅпїЅпїЅ" anstelle von Zeichenfolge.

Was war mit diesem Code falsch?

+0

ist die Konsole richtig eingerichtet Unicode angezeigt werden? Es ist möglicherweise besser, die Integralwerte der gesuchten Byte manuell zu überprüfen, anstatt sie auszudrucken, um zu überprüfen, ob die Daten korrekt sind und die Anzeige der Daten nicht Ihren Erwartungen entspricht oder wenn es sich um Rohdaten handelt eigentlich falsch. – xaxxon

Antwort

1

Der Code sieht korrekt aus, so wie @xaxxon vorgeschlagen, würde ich überprüfen, dass das Terminal, das Sie für die Ausgabe verwenden, mit Nicht-ASCII-Zeichen umgehen kann, und dass die Eingabedatei (falls vorhanden) korrekt codiert ist.

Auch Ihre V8-Versionen scheint ziemlich alt zu sein (z. B. der HandleScope-Konstruktor dauert immer einen Isolate* Parameter in diesen Tagen), so ist es auch möglich, dass Sie einige alte Fehler, die seit behoben wurde.

Als Referenz die official sample shell tun Dinge, fast die gleiche Art und Weise, und auf meinem Rechner mindestens arbeitet mit Ihrem Test-String fein:

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

Ja, ich benutze einen alten Code wegen der endgültigen Größe der EXE-Datei (ich habe etwa 2 MB im Vergleich zu 8 MB mit den neuesten Quellen). – Khachatur

Verwandte Themen