1

我有一个奇怪的问题,也许有人有洞察力。我使用以下代码将查询字符串编码为 Android 上的 URL:

request = REQUEST_BASE + "?action=loadauthor&author=" + URLEncoder.encode(author, "UTF-8");

然后我在字符串中添加一些其他参数并创建一个如下所示的 URI:

uri = new URI(request);

在某个时刻,我提取查询字符串来生成校验和:

uri.getRawQuery().getBytes();

然后我发送它:

HttpGet get = new HttpGet(uri);

然后在 Appengine 服务器上检索字符串并尝试匹配校验和:

String query = req.getQueryString();

通常,这可以正常工作。但是,在前往服务器的途中似乎有一些字符未编码。例如,

action=loadauthor&author=Charles+Alexander+%28Ohiyesa%29+Eastman×tamp=1343261225838&user=1479845600

在服务器日志(和 GAE 应用程序)中显示为:

action=loadauthor&author=Charles+Alexander+(Ohiyesa)+Eastman×tamp=1343261226837&user=1479845600

这只发生在少数字符(如括号)上。其他字符始终保持编码。有没有人想过我可能做错了什么?任何反馈表示赞赏。

4

2 回答 2

1

我从来没有找到解决这个问题的方法。在将内容发送到服务器之前,我通过在客户端上取消编码某些字符来解决它:

request = request.replace("%28", "(");
request = request.replace("%29", ")");
request = request.replace("%27", "'");

如果有人有更好的解决方案,我相信我(和其他人)会感兴趣!

于 2012-08-05T22:49:38.220 回答
0

URLEncoder 不对括号和某些其他字符进行编码,因为它们对于大多数服务器来说应该是“安全的”。请参阅URLEncoder。如有必要,您必须自己更换这些。

例子:

URI uri = new URI(request.replace("(","%28"));

如果需要大量替换,可以试试 request.replaceAll(String regularExpression, String replacement)。当然,这需要了解正则表达式。

于 2012-07-26T08:34:27.957 回答