好的,我在使用节点 12 和 v8 7.4.288 时遇到了很多麻烦。
所有常见的东西都已被弃用,所以我启动了 gdb 来检查实际的现状。
所以 - 我假设您首先从 Argument 读取字符串 - 一种明智的方式(我可以从文档和示例中找出而不会太痛苦的唯一方式)是:
v8::Local<v8::String> fileName;
fileName = args[0].As<v8::String>();
正确 - 现在您有了 v8 格式的“字符串”(如 v8::Local<v8::string>)
要访问 v8::string(以便任何当前的 v8::String 内容甚至有点用处) - 您需要像这样取消引用变量:
*fileName // 现在是 v8::String - 你可以使用 WriteUtf8 等函数 - 你可以用它做的事情记录在这里:
https://v8docs.nodesource.com/node-12.0/d2/db3/classv8_1_1_string.html
您会看到 WriteUtf8 函数需要隔离参数和 char* 缓冲区 - 我只是在这里猜测我的最大字符串长度并创建一个快速 char 缓冲区来保存我认为有意义的任何内容:
char* charFileName = new char[8192];
现在我有足够的空间来存储一些 UTF 8 字符串 - 我通过调用 WriteUtf8 函数来做到这一点
(*fileName)->WriteUtf8(isolate, charFileName);
最后 - 我已经像这样在其他地方(在全局范围内)定义了我的 std::string
static std::string stringFileName;
所以 - 要将数据从 char* 获取到我的 std::string 我这样做:
stringFileName.assign(charFileName);
如果您愿意,也可以通过调用 std::string 构造函数并在构造函数中将 char* 传递给它来实现。
我删除了我原来的 char* 进行清理,因为它不再需要了 - 当 std::string 超出范围时,它会自行清理 - 我不知道 v8 如何自行清理,老实说我不知道没关系。
delete charFileName;
终于 - v8::String 字符串变成可用的 std::string - 今天(2020 年)
另外 - 如果你现在想在 std::string 和 V8::String 之间进行转换,你可能会做类似的事情 - 将 std::string 转换为 char*,创建一个 <v8::Local<v8::String>>,取消引用它 (*mylocalv8string)并在取消引用的 localv8string 上调用 NewFromUtf8 (isolate, char*)