java - Apache HttpClient - 在查询中使用 utf-8 字符向 ETools.ch 发送请求

标签 java apache utf-8 http-post apache-commons-httpclient

如果查询不包含任何 utf-8 字符,则代码可以正常工作。一旦有一个 utf-8 字符,ETools 就会提供我意想不到的结果。例如,对于 "trees" 我得到正确的结果,对于 "bäume" (德语中的树)我得到奇怪的结果。看起来 ETools 收到的查询为 "b%C3%A4ume",并使用这些字符查找确切的查询,而不是查找 "bäume"。我认为如果我设置一些 header 参数,问题可能会得到解决,但我不知道那里可能有哪些参数。

String query = "some+query+with+utf8+chars";

HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost();

List<NameValuePair> parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("query", query));
parameters.add(new BasicNameValuePair("country", "web"));
parameters.add(new BasicNameValuePair("language", "all"));
parameters.add(new BasicNameValuePair("dataSourceResults", String.valueOf(40)));
parameters.add(new BasicNameValuePair("pageResults", String.valueOf(40)));
request.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8"));
request.setHeader("Content-Type", "application/x-www-form-urlencoded");
request.setURI("http://www.etools.ch/searchAdvancedSubmit.do?page=2");

MyResponse myResponse = client.execute(request, myResponseHandler);

request.reset();
client.getConnectionManager().shutdown();

最佳答案

您至少应该将您的字符集添加到 Content-Type 中(默认为 latin1):

request.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

如果这不起作用,则可能是服务器错误。您可能需要尝试将表单提交为 multipart/form-data ( RFC 2388 ),而不是 URL 编码。已经有StackOverflow answer并提供一个您可以使用的示例。

关于java - Apache HttpClient - 在查询中使用 utf-8 字符向 ETools.ch 发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15220396/

相关文章:

apache - .htaccess 重定向以 %(百分比)符号开头

mysql - 如何更改 mysql 设置,以便它是所有内容的默认 UTF-8?

android - 使用volley-utf8发送数据

python - MySQL Encoding 4 byte in 3 byte utf-8 - 不正确的字符串值

java - 如何强制jar在java 7中运行?

java - 在 Selenium/Java 中终止 chromedriver 进程

java - 我的网络应用程序如何在加载时清除浏览器缓存?

java - 哪个 ODBC-JDBC 桥将自己的调用映射到 JDBC 驱动程序?

apache - 什么是 SSL 心跳?

node.js - 如何使用具有不同端口的单个 ssl 证书运行 Node js 和 apache?