Java &引用;“非法字符”;Android中HttpGet的URL中获得双重编码

Java &引用;“非法字符”;Android中HttpGet的URL中获得双重编码,java,android,url,httpclient,http-get,Java,Android,Url,Httpclient,Http Get,整个晚上我都在试图找到解决办法 我编写了一个从web服务器请求数据的应用程序。服务器以JSON格式应答。 除了在我的应用程序中输入类似于ä的umlaut外,一切都很好 在下面的例子中,我假设请求URL是,我正在搜索“Jäger” 正确的调用应该是h++p://example.com/?q=J%C3%A4ger (对于加号表示抱歉,但垃圾邮件保护不允许我正确发布。) 所以我现在的问题是: 当我将编码或未编码的URL字符串传递给HttpGet时,它将始终生成一个双精度编码的URL 然后,对我的服务器

整个晚上我都在试图找到解决办法

我编写了一个从web服务器请求数据的应用程序。服务器以JSON格式应答。 除了在我的应用程序中输入类似于ä的umlaut外,一切都很好

在下面的例子中,我假设请求URL是,我正在搜索“Jäger”

正确的调用应该是h++p://example.com/?q=J%C3%A4ger (对于加号表示抱歉,但垃圾邮件保护不允许我正确发布。)

所以我现在的问题是:

当我将编码或未编码的URL字符串传递给HttpGet时,它将始终生成一个双精度编码的URL

然后,对我的服务器的请求是(它对百分号进行编码) 这导致服务器在数据库中搜索J%C3%A4ger,这显然是错误的

所以我的问题是,如果用户输入“Jäger”,我的应用程序将调用正确编码的URL,我该如何实现这一点

谢谢你的帮助

以下是当前使用的代码。。。这可能是我最糟糕的想法

URI url = new URI("http", "//example.com/?q=" + ((EditText)findViewById(R.id.input)).getText().toString(), null);
Log.v("MyLogTag", "API Request: " +  url);
HttpGet httpGetRequest = new HttpGet(url);

// Execute the request in the client
HttpResponse httpResponse;
httpResponse = defaultClient.execute(httpGetRequest);

更新:抱歉,
HttpParams
不是用于请求参数,而是用于配置
HttpClient

在Android上,您可能希望使用,如中建议的:

在Android之外,您最好的选择是手动构建查询字符串(尽管存在编码方面的麻烦),或者查找类似于Android的
Uri.Builder


Philipp Reichard你明天就可以试试这个。现在是凌晨1点,我大约6小时后就要去上班了。同样的,我明天也会回来查看:)哎呀,我把HttpParams错当成了不正确的东西——请看我更新的答案。
Uri uri = new Uri.Builder()
    .scheme("http")
    .authority("example.com")
    .path("someservlet")
    .appendQueryParameter("param1", foo)
    .appendQueryParameter("param2", bar)
    .build();

HttpGet request = new HttpGet(uri.toString());

// This looks very tempting but does NOT set request parameters
// but just HttpClient configuration parameters:
// HttpParams params = new BasicHttpParams();
// params.setParameter("q", query);
// request.setParams(params);

HttpResponse response = defaultClient.execute(request);
String json = EntityUtils.toString(response.getEntity());