我有一个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。
这是我唯一可以保留字符集的方法吗?我错过了什么吗?
感谢。
答案 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");