我们的应用程序是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中的“)”字符,这样就不会被破坏?
答案 0 :(得分:2)
从the documentation来看,即使在宽容模式下,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");
我不是百分之百确定双重%需要在那里,但我记得过去有麻烦。尝试两种方式。
或者,您可以尝试使用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() );