最近在项目中又遇到一个小问题,通过HttpURLConnection来传递汉字时,服务端获取汉字参数时都为乱码,以下分别为在servlet或action中获取URL中的汉字解决办法:
1. 以下代码为 通过HttpURLConnection连接来传递参数,其中,对待汉字的操作需要先进行编码的操作,之后在服务端进行解码操作即可。
- public static void main(String[] args) throws UnsupportedEncodingException {
- // String url = "http://61.154.14.46:8080/exter.shtml?serviceType=1011";
- String name = java.net.URLEncoder.encode("行子爱上大叔的","UTF-8");
- String url = "http://localhost:8081/exter.shtml?serviceType=1023&guid=11&mobile=13696900475&content=123" + name;
- // String url = "http://localhost:8080/webtest/servlet/URLTest?name=这个是测试用的" + name;
- // String url = "http://localhost:8081/exter.shtml?serviceType=1022&menuId=4481&mobile=15806092760&text_data=linlinlin&imgName=testa.jpg";
- // getReturnData1(url);
- sendPost(url,null);
- }
public static void main(String[] args) throws UnsupportedEncodingException {
// String url = "http://61.154.14.46:8080/exter.shtml?serviceType=1011";
String name = java.net.URLEncoder.encode("行子爱上大叔的","UTF-8");
String url = "http://localhost:8081/exter.shtml?serviceType=1023&guid=11&mobile=13696900475&content=123" + name;
// String url = "http://localhost:8080/webtest/servlet/URLTest?name=这个是测试用的" + name;
// String url = "http://localhost:8081/exter.shtml?serviceType=1022&menuId=4481&mobile=15806092760&text_data=linlinlin&imgName=testa.jpg";
// getReturnData1(url);
sendPost(url,null);
}
- /**
- * 通过HTTP协议以POST形式发送指定文件至指定url
- * @param url
- * @throws IOException
- */
- public static void sendPost(String url,InputStream in) {
- HttpURLConnection conn = null;
- OutputStreamWriter osw = null;
- try {
- File file = new File("D:/test2.jpg");
- if(!file.exists()) {
- try {
- file.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- URL url1 = new URL(url);
- conn = (HttpURLConnection)url1.openConnection();
- conn.setReadTimeout(10000); // 缓存的最长时间
- conn.setDoInput(true);// 允许输入
- conn.setDoOutput(true);// 允许输出
- conn.setUseCaches(false); // 不允许使用缓存
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Charsert", "UTF-8");
- //conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + java.util.UUID.randomUUID().toString());
- //需要传递流时,一定要添加的参数,而且ACTION中通过request.getInputStream获取流的情况下,也必须添加该参数
- conn.setRequestProperty("content-type", "text/html");
- OutputStream o = conn.getOutputStream();
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
- int BUFFER_SIZE = 1024;
- byte[] buf = new byte[BUFFER_SIZE];
- int size = 0;
- try {
- while ((size = bis.read(buf)) != -1)
- o.write(buf, 0, size);
- } catch (IOException e) {
- e.printStackTrace();
- }
- finally {
- try {
- bis.close();
- o.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if (conn.getResponseCode() != HttpURLConnection.HTTP_OK)
- System.out.println( "connect failed!");
- } catch (IOException e) {
- e.printStackTrace();
- }
- finally
- {
- if (osw != null)
- try {
- osw.close() ;
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- if (conn != null)
- conn.disconnect() ;
- }
- }
/**
* 通过HTTP协议以POST形式发送指定文件至指定url
* @param url
* @throws IOException
*/
public static void sendPost(String url,InputStream in) {
HttpURLConnection conn = null;
OutputStreamWriter osw = null;
try {
File file = new File("D:/test2.jpg");
if(!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
URL url1 = new URL(url);
conn = (HttpURLConnection)url1.openConnection();
conn.setReadTimeout(10000); // 缓存的最长时间
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(false); // 不允许使用缓存
conn.setRequestMethod("POST");
conn.setRequestProperty("Charsert", "UTF-8");
//conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + java.util.UUID.randomUUID().toString());
//需要传递流时,一定要添加的参数,而且ACTION中通过request.getInputStream获取流的情况下,也必须添加该参数
conn.setRequestProperty("content-type", "text/html");
OutputStream o = conn.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int BUFFER_SIZE = 1024;
byte[] buf = new byte[BUFFER_SIZE];
int size = 0;
try {
while ((size = bis.read(buf)) != -1)
o.write(buf, 0, size);
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
bis.close();
o.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK)
System.out.println( "connect failed!");
} catch (IOException e) {
e.printStackTrace();
}
finally
{
if (osw != null)
try {
osw.close() ;
} catch (IOException e1) {
e1.printStackTrace();
}
if (conn != null)
conn.disconnect() ;
}
}
2. servlet端的解析汉字操作: 直接进行编码的转换即可显示为汉字
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- // response.setContentType("text/html");
- request.setCharacterEncoding("UTF-8");
- String s = request.getParameter("name");
- System.out.println("s22 is " + new String(s.getBytes("iso-8859-1"),"UTF-8"));
- // InputStream in = request.getInputStream();
- // if(in != null) {
- // System.out.println("流不是空的。");
- // this.writeInputStreamToFile(in);
- // System.out.println("server time is " + new Date());
- // } else {
- // System.out.println("流是空的。");
- // }
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setContentType("text/html");
request.setCharacterEncoding("UTF-8");
String s = request.getParameter("name");
System.out.println("s22 is " + new String(s.getBytes("iso-8859-1"),"UTF-8"));
// InputStream in = request.getInputStream();
// if(in != null) {
// System.out.println("流不是空的。");
// this.writeInputStreamToFile(in);
// System.out.println("server time is " + new Date());
// } else {
// System.out.println("流是空的。");
// }
3. 在action中解析汉字的操作: 在action中直接设置下编码格式,直接获取就可。
request.setCharacterEncoding("utf-8");
System.out.println(form.getContent());