0

我们的应用程序是 32 位应用程序。当它安装在 Windows 7 64 位时,通常安装在“C:\Program Files (x86)”,而不是“C:\Program Files”。我们正在根据安装位置构建一个 Url,并将其作为 Web 服务的一部分传递。我们正在构建这样的 Url:

ppmPath = "http://" + ipAddress + ":13007/" + folder + ".ppm" + "?filePath="
          + applicationDirPath + "/" + FIRMWARE;
QUrl ppmURL( ppmPath, QUrl::TolerantMode );
ppmPath = QString( ppmURL.toEncoded() );

变量类型和含义是通常的。

由于 Windows 7 64 位的“applicationDirPath”包含一个右括号“)”——在“(x86)”子字符串中——显然 URL 已损坏。如果我们将它安装到任何其他位置,它会完美运行,即使该位置有任何其他特殊字符。

URL中的“)”字符如何处理,这样才不坏呢?

4

1 回答 1

2

文档来看,括号似乎不是由 QUrl 自动编码的,即使在宽容模式下也是如此。如果您首先将 URL 包装在 QString 中,然后将所有(字符替换为“%28”,并将所有)字符替换为“%29”,那么它的行为应该与您预期的一样。

QString ppmPath = QString("http://" + ipAddress + ":13007/" + folder + ".ppm" + "?filePath="
          + applicationDirPath + "/" + FIRMWARE);
QUrl ppmURL( ppmPath, QUrl::TolerantMode );
ppmPath = QString( ppmURL.toEncoded() );
ppmPath.replace(QChar('('), "%%28");
ppmPath.replace(QChar(')'), "%%29");

我不是 100% 确定双% 需要在那里,但我记得过去遇到过麻烦。尝试两种方式。

或者,您可以尝试使用QUrl::toPercentEncoding()并完全跳过构造函数。它似乎可以转换括号。

QUrl ppmURL(QString("http://" + ipAddress + ":13007/" + folder + ".ppm"), QUrl::TolerantMode );
QString filepath = QUrl::toPercentEncoding(applicationDirPath + "/" + FIRMWARE);
ppmUrl.addEncodedQueryItem("filepath", filepath.toLocal8Bit());
ppmPath = QString( ppmURL.toEncoded() );
于 2012-11-13T22:35:53.593 回答