c++ 如何对字符串进行转义以确保它在JS源代码中是有效的字符串文字?

dkqlctbz  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(100)

我有一个Qt应用程序,它嵌入了一个Web浏览器(QWebEngineView)。我想从C++应用程序调用一个带有字符串参数的JavaScript函数。这样做的方法是调用

page()->runJavaScript("setContent(\"hello\");");

字符串
这在简单的情况下是有效的。但是,如果我尝试加载,比如说,一个C++源文件,并将其用作setContent的参数,这将中断,因为我不能简单地像这样组装字符串:

auto js = QString("setContent(\"%1\");").arg(fileStr);


我尝试了以下方法:

fileStr = fileStr.replace('"', "\\\"");
fileStr = fileStr.replace("\n", "\\n");


但是很明显这不能转义字符串,当我调用这个JavaScript的时候,我得到了一个错误。我怎样才能通用地转义一个带有换行符和可能的特殊字符的长字符串,这样我就可以构造一个像这样的有效的js片段?

z8dt9xmd

z8dt9xmd1#

所以,经过一些研究,我遇到了QWebChannel,这是用于应用程序和托管网页之间的双向通信。在示例中导入的qwebchannel.js可以找到here。从那里,这是我做的:
在C++中:

auto channel = new QWebChannel(this);
  page()->setWebChannel(channel);
  channel->registerObject("doc", Doc);

字符串
在HTML/JS中:

new QWebChannel(qt.webChannelTransport,
       function(channel) {
         var doc = channel.objects.doc; // this is "doc" from the registerObject call
         editor.setValue(doc.text);
         doc.textChanged.connect(updateText); // textChanged is a signal of the class of doc.
       }
   );


因此,尽管这并不能直接回答这个问题,但这里提出的内容可以用来实现同样的效果。

14ifxucb

14ifxucb2#

您可以使用QJsonDocument将字符串编码为JSON字符串,因为有效的JSON字符串也是有效的JavaScript字符串。
不幸的是,我还没有找到一种方法来只获取字符串,但是你可以得到一个包含字符串的元素的数组,你可以通过使用[0]轻松地在JavaScript中提取字符串(或者,如果你像在C++中一样需要转义字符串,你可以使用正则表达式来删除第一个[和最后一个])。
下面是一个示例:

const QString stringToBeEscaped = "A string with \"quotes\"\nand newlines";
const QJsonDocument jsonDoc = QJsonDocument::fromVariant(QStringList{stringToBeEscaped});
QString escapedString = QString::fromUtf8(jsonDoc.toJson());
qDebug() << escapedString;  //"[\n    \"A string with \\\"quotes\\\"\\nand newlines\"\n]\n"
escapedString += "[0]";     //To extract the string from the array Javascript-side

page()->runJavaScript(QString("alert(%1)").arg(escapedString));

字符串

相关问题