Character encoding 通过apache HTTPClient传递特殊字符

Character encoding 通过apache HTTPClient传递特殊字符,character-encoding,Character Encoding,我有一个servlet,它接受HTML内容作为请求参数的一部分。HTML是本地化的,可能是法语、西班牙语等。。。内容。 我还使用apache HTTP client向该servlet发出测试请求,该servlet具有以下头定义: HttpClient client = new HttpClient(); PostMethod method = new PostMethod("<URL>"); String html = FileUtils.readFileToString(inpu

我有一个servlet,它接受HTML内容作为请求参数的一部分。HTML是本地化的,可能是法语、西班牙语等。。。内容。 我还使用apache HTTP client向该servlet发出测试请求,该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");
但是,当我从request参数获取html时,文本变成
T?l?charger un fichier

我浏览了一些链接,比如关于字符集的内容以及浏览器对特殊字符的编码方式。如果我使用UTF-8对html进行URL编码,然后在servlet中使用相同的字符集对其进行解码,我将得到预期的html

这是我唯一能保存字符集的方法吗?我错过什么了吗


谢谢。

既然文件本身的问题已经解决,请尝试按如下方式修改代码:

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

 ...

既然文件本身的问题已经解决,请尝试按如下方式修改代码:

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

 ...

只要试试这个post方法

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

只要试试这个post方法

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

我无法通过HttpClient套接字连接发送希伯来语。当传递时,它会变成垃圾。我已经讨论了上面提到的所有要点。但问题仍然存在。

我无法通过HttpClient套接字连接发送希伯来语。当传递时,它会变成垃圾。我已经讨论了上面提到的所有要点。不过,问题仍然存在。

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

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

我想我已经通过检查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());
HttpPost方法=新的HttPost(“”);
EntityBuilder=EntityBuilder.create();
setContentType(ContentType.APPLICATION_JSON);
setContentEncoding(StandardCharsets.UTF_8.name());
...
方法setEntity(builder.build());
完成了这项工作(尽管我认为在这里设置contentType是多余的)


我使用的是httpclient osgi版本4.5.4。

我想我已经通过检查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());
HttpPost方法=新的HttPost(“”);
EntityBuilder=EntityBuilder.create();
setContentType(ContentType.APPLICATION_JSON);
setContentEncoding(StandardCharsets.UTF_8.name());
...
方法setEntity(builder.build());
完成了这项工作(尽管我认为在这里设置contentType是多余的)


我使用的是httpclient osgi版本4.5.4。

从文件中解码后,您是否验证了
html
是否正确?您可能会看到
当您
System.out.println(html)
时,这意味着html文件不是UTF-8。字符x的存在并不意味着文件正在编码y。该文件可以是支持字符x的任何编码。我现在得到了正确的法语和西班牙语。我在记事本++中将编码更改为utf-8。在获取html后的servlet中,我使用FileUtils.writeStringToFile(新文件(“c:\\test.html”),消息“UTF-8”)写回一个文件;而且我能很好地看到这些字符。但对于中国人来说,即使我从文件中读取后在控制台中正确地看到了字符,但在写入过程中,它会被转换为???您从文件中解码后是否验证了
html
是正确的?您可能会看到
当您
System.out.println(html)
时,这意味着html文件不是UTF-8。字符x的存在并不意味着文件正在编码y。该文件可以是支持字符x的任何编码。我现在得到了正确的法语和西班牙语。我在记事本++中将编码更改为utf-8。在获取html后的servlet中,我使用FileUtils.writeStringToFile(新文件(“c:\\test.html”),消息“UTF-8”)写回一个文件;而且我能很好地看到这些字符。但对于中国人来说,即使我在我的控制台中正确地看到了从文件中读取的字符,在写入过程中它会被转换成???谢谢你的回复。奇怪的是,正在传递的html没有出现在请求参数中,我尝试了以下操作:method.addParameter(“html”,html);以及method.getParams().setParameter(“html”,html);参数为null,不确定您的回复是否正确。奇怪的是,正在传递的html没有出现在请求参数中,我尝试了以下操作:method.addParameter(“html”,html);以及method.getParams().setParameter(“html”,html);参数为null,不确定为什么您可以提供一些代码作为答案?也许只有一行?你能为你的答案提供一些代码吗?也许只有一艘班轮?