通过apache HTTPClient传递特殊字符

use*_*550 1 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");
Run Code Online (Sandbox Code Playgroud)

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

Télécharger un fichier
Run Code Online (Sandbox Code Playgroud)

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

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

这是我唯一能做的就是保留这些字符集吗?我错过了什么吗?

谢谢.

Esa*_*ija 5

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

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

 ...
Run Code Online (Sandbox Code Playgroud)

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

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

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