java網路傳輸字元編碼亂碼解決
1.需求:後臺使用java編碼,傳遞到前臺使用js接收解碼
解決:
1)後臺:json字串形式傳遞
①簡單的java物件轉化成jsonObject,再toString()
JSONObject rtObject = new JSONObject();
rtObject.put("flag",URLEncoder.encode((String)rs.get("error_code"), Config.ENCODING));
rtObject.put("errorMessage",URLEncoder.encode((String)rs.get("error_msg"), Config.ENCODING));
return rtObject.toString();
②有很多屬性的物件,整體當做jsonObject傳遞,通過一個方法convertUrlEncodeString先轉化成屬性值編碼後的物件,然後通過bean2JSon方法將java物件轉化成jsonObject字串
/**
* bean複製String型別的屬性,將字元轉化成url編碼格式(UTF-8),用於網路傳輸
* @param oriBean
* @param bean
* @return
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws UnsupportedEncodingException
*/
private OcrResultBean convertUrlEncodeString(OcrResultBean oriBean) throws IllegalArgumentException, IllegalAccessException, UnsupportedEncodingException{
OcrResultBean bean
Field[] field = oriBean.getClass().getDeclaredFields();
for(int i=0 ; i<field.length ; i++){ //遍歷所有屬性
Field f = field[i];
f.setAccessible(true); //設定些屬性是可以訪問的
Object val = f.get(oriBean);//得到oriBean此屬性的值
String type = f.getType().toString();//得到此屬性的型別
if (type.endsWith("String")) {
f.set(bean,URLEncoder.encode((String)val,"UTF-8")) ; //給bean此屬性設值,utf-8編碼
}
/*else if(type.endsWith("int") || type.endsWith("Integer")){
f.set(bean,12) ; //給屬性設值
}else{
//System.out.println(f.getType()+"\t");
}*/
}
return bean;
}
public String bean2JSon(Object bean){
try {
return mapper.writeValueAsString(bean);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
2)前臺js接收解碼
//$("#result").html(decodeURI(JSON.stringify(data))); //不要使用此方法,會出現亂碼,如8172323%40qq.com (%40應該是@)
$("#result").html(decodeURIComponent(JSON.stringify(data))); //此方法不會出現亂碼