咱們常常在程序中發送Web請求,可是也常常在請求中出現亂碼問題。下面的代碼是發送請求的通用方法,可是在某些環境下中文會亂碼,如何解決亂碼問題呢?一開始的時候,我只想到對傳入的參數進行html
URLEncoder.encode(params.get("title"),"UTF-8");java
而後在服務端發現接收的數據仍是亂碼,根本不用解碼已經亂了,後面高人指點以下:json
URLEncoder.encode(URLEncoder.encode(params.get("title"),"UTF-8"),"UTF-8");服務器
而後在服務器端以下:網絡
URLDecoder.decode(jsonvalue.get("title").toString(),"UTF-8");app
終於獲得了想要的中文。ide
總結:網絡傳輸時,數據會被解析兩次,第一次是在網絡中,第二次是在服務器。若是咱們在傳輸網絡數據的時候沒有加碼,那麼會解析爲亂碼,因此咱們避免中文亂碼,須要加碼兩次,第一次是讓網絡解析,解析事後仍是加碼的全部不會亂碼,到服務器在解碼問題就解決了。post
/** * 客戶端發送HTTP請求通用POST方法 * @param url * @param params * @return * @throws Exception */ public static String postHttpRequest(String url , Map<String,String> params)throws Exception{ // 對空URL不處理 if(url == null || url.length() == 0) return null; String result = null; // 處理參數 String param = encodeUrlParams(params); if(param != null && param.length() > 0){ if(url.contains("?")){ url = url + "&" + param; }else{ url = url + "?" + param; } } URL console = new URL(url); HttpURLConnection conn = (HttpURLConnection)console.openConnection(); conn.setConnectTimeout(3000);//追加一個超時設置:3秒 conn.setRequestMethod("POST");// POST請求 conn.setRequestProperty("Content-type", "text/html"); conn.setRequestProperty("Accept-Charset", "utf-8"); conn.setRequestProperty("contentType", "utf-8"); // 開始鏈接 conn.connect(); InputStream is = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF8")); StringBuffer sb = new StringBuffer(); String curLine=""; while ((curLine = reader.readLine()) != null) { sb.append(curLine); } is.close(); result = sb.toString(); return result; } /** * 處理參數 * @param param * @return * @throws UnsupportedEncodingException */ private static String encodeUrlParams(Map<String,String> param) throws UnsupportedEncodingException{ StringBuilder bulider = new StringBuilder(); if(param != null){ Set<String> keys = param.keySet(); for(String key : keys){ if(StringUtils.isBlank(param.get(key))){ bulider.append(key).append("=").append("").append("&"); }else{ bulider.append(key).append("=").append(param.get(key)).append("&"); } } } if(bulider.length() > 0){ return bulider.substring(0, bulider.length()-1); } return bulider.toString(); } }