通过apache HTTPClient传递特殊字符

时间:2013-04-06 11:25:33

标签: character-encoding

我有一个servlet,它接受HTML内容作为请求参数的一部分。 HTML是本地化的,可以是法语,西班牙语等......内容。 我还使用apache HTTP客户端向此servlet发出请求以进行测试,其具有以下标头定义:

HttpClient client = new HttpClient();

PostMethod method = new PostMethod("<URL>");
String html = FileUtils.readFileToString(inputHTMLFile, "UTF-8");
method.addParameter("html", html);

method.addRequestHeader("Accept", "*/*");    
method.setRequestHeader("accept-charset", "UTF-8");

无论读取什么HTML都有字符编码utf-8,示例文本:

Télécharger un fichier

然而,当我从请求参数中获取html时,文本变为T?l?charger un fichier

我浏览了一些链接,例如http://www.oracle.com/technetwork/articles/javase/httpcharset-142283.html,其中讨论了charset以及浏览器通常如何编码特殊字符。如果我使用UTF-8对html进行URLEncode,然后在servlet中使用相同的字符集解码,我会按预期获得HTML。

这是我唯一可以保留字符集的方法吗?我错过了什么吗?

感谢。

6 个答案:

答案 0 :(得分:5)

既然修复了文件本身的问题,请尝试按如下方式修改代码:

 HttpClient client = new HttpClient();
 PostMethod postMethod = new PostMethod("<URL>");
 postMethod.getParams().setContentCharset("utf-8"); //The line I added

 ...

请注意,客户端现在需要将请求解码为UTF-8。法语和西班牙语正常工作,因为它们的字符包含在默认的ISO-8859-1字符集中。汉字不是。如果在客户端上正确解码了法语和西班牙语,则客户端将请求解码为ISO-8859-1,并且发送UTF-8可能会失败。

所以你可以尝试添加这个:

postMethod.setRequestheader("Content-Type", "application/x-www-form-url-encoded; charset=utf-8");

答案 1 :(得分:1)

试试post方法吧。

HttpPost request = new HttpPost(webServiceUrl);
StringEntity str = new StringEntity(YourData);
str.setContentType("application/json");
HttpPost.setEntity(new StringEntity(str, HTTP.UTF_8));

答案 2 :(得分:0)

我无法通过HttpClient套接字连接发送希伯来语。通过时将其更改为垃圾。我已经完成了上述所有要点。尽管如此,问题仍然存在。

答案 3 :(得分:0)

您最好将字符串更改为base64编码,然后发送。

答案 4 :(得分:0)

我认为我是通过检查EntityBuilder反编译的代码找到了原因的:EntityBuilder忽略了与参数有关的contentEncoding字段,它使用contentType字段中的一个。通过查看org.apache.http.entity.ContentType,唯一具有UTF-8的预定义值是org.apache.http.entity.ContentType.APPLICATION_JSON。

所以就我而言

HttpPost method = new HttPost("<URL>");
EntityBuilder builder = EntityBuilder.create();
builder.setContentType(ContentType.APPLICATION_JSON);
builder.setContentEncoding(StandardCharsets.UTF_8.name());
...
method.setEntity(builder.build());

完成这项工作(尽管我认为在这里设置contentType是多余的)。

我正在使用httpclient-osgi版本4.5.4。

答案 5 :(得分:-1)

PostMethod method = new PostMethod("URL");
method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
相关问题