通过apache HTTPClient传递特殊字符
我有一个接受HTML内容作为请求参数的一部分的servlet。 HTML是本地化的,可能是法文,西班牙文等等。 我也使用Apache HTTP客户端做出这个servlet用于测试目的,其具有如下报头定义的请求:通过apache HTTPClient传递特殊字符
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
然而,当我从文本中要求PARAM获取HTML变得T?l?charger un fichier
我通过几个环节如http://www.oracle.com/technetwork/articles/javase/httpcharset-142283.html其中谈到字符集和浏览器如何通常会去编码特殊字符。如果我要使用UTF-8 URLEncode html,然后使用servlet中的相同字符集对其进行解码,那么我会按照预期获取HTML。
这是我能做的唯一的事情来保存这些字符集吗?我错过了什么吗?
谢谢。现在
与该文件的问题本身是固定的,尝试修改代码如下:
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");
感谢您的回复。奇怪的是传递的html没有进入请求参数,我尝试做以下操作:method.addParameter(“html”,html);以及method.getParams()。setParameter(“html”,html);该参数为空,不知道为什么 – user320550 2013-04-06 16:04:50
只是尝试一下本作POST方法。
HttpPost request = new HttpPost(webServiceUrl);
StringEntity str = new StringEntity(YourData);
str.setContentType("application/json");
HttpPost.setEntity(new StringEntity(str, HTTP.UTF_8));
PostMethod method = new PostMethod("URL");
method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
是否已确认'html'是正确的对你从文件解码之后呢?当你使用System.out.println(html)时,你可能会看到''''这意味着html文件不是UTF-8。字符x的存在并不意味着文件在编码y中。该文件可以是任何支持字符x的编码。 – Esailija 2013-04-06 11:32:08
我现在正在为法语和西班牙语正确无误。我已经在notepad ++中将编码更改为utf-8。在获取html后的servlet中,我使用FileUtils.writeStringToFile(new File(“c:\\ test.html”),message,“UTF-8”)将文件写回到文件中。我可以很好地看到字符。但是对于中文,即使我从文件中读取后在控制台中正确地看到字符,在写入期间它会转换为 – user320550 2013-04-06 14:18:44