InputStream按指定編碼讀取解決亂碼問題
在測試時出現一個很常見的問題,就是客戶端收到服務端返回的資料總是亂碼。開始一直以為是服務端的問題,通過上網查詢,大家都說使用PrintWriter返回資料時需要在PrintWriter out = response.getWriter();前面設定,照做了還是不行,接著查,大家都這樣說,經過冷靜思考,認為很有可能是客戶端的問題,如果不設定編碼,很有可能服務端和客戶端的預設編碼不一致。客戶端採用InputStream接收資料,預設編碼方式取決於作業系統,服務端為了解決亂碼的問題設定的UTF-8編碼。為了驗證這個結論,接著搜尋,果然找個InputStreamReader(InputStream in, String charsetName),抱著試試看的態度,最終解決了亂碼的問題。
下面將服務端的核心的程式碼貼一下:
//輸出響應文字
private void outText(HttpServletResponse response,String strOutText) {
PrintWriter out = null;
try {
response.setContentType("text/html; charset=utf-8");
out = response.getWriter();
out.print(strOutText);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
為了再次避免出現此類錯誤,將從InputStream通過指定編碼得到String進行封裝,客戶端程式碼如下:
public static String getStrFromInsByCode(InputStream is, String code){
StringBuilder builder=new StringBuilder();
BufferedReader reader=null;
try {
reader = new BufferedReader(new InputStreamReader(is,code));
String line;
while((line=reader.readLine())!=null){
builder.append(line+"\n");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return builder.toString();
}
客戶端使用:
InputStream input = conn.getInputStream();
result = Tool.getStrFromInsByCode(input,"utf-8");
其中,Tool為自定義的工具類,conn為HttpURLConnection conn = (HttpURLConnection) url.openConnection();
好了,今天先到這吧!