星期三, 9月 27, 2017

解決因調整程式執行編碼,導致其它程式出現亂碼的問題。

為了解決程式輸入產生亂碼的問題,我把啟動前端程式的JVM的編碼參數移除。

使得JVM啟動程式時使用系統預設編碼。但這個導致了我們呼叫服務器get function回傳的中文值是亂碼。

為了要解決這個亂碼問題,我們打算先了解各系統使用的編碼本質,偵測程式碼如下:

String enc = System.getProperty("file.encoding");
System.out.println(enc);

得到的不是UTF-8,而是繁中系統所使用的MS950。

由於服務器系統回傳的是UTF-8,如果不使用UTF-8接收,直接用MS950接收,會產生亂碼。

於是我們將HttpURLConnection回傳的Inputstream,使用編碼為UTF-8的InputStreamReader接收。

這樣就可以解決MS950與UTF-8之間串接所造成的亂碼問題。程式碼如下,紅字部份為重點:

public static String doGet(String urlString, String contentType, String charset) throws IOException {
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(30000);
con.setRequestMethod("GET");
con.setRequestProperty("Content-Type", contentType);
con.setRequestProperty("charset", charset);
//
int http_status = con.getResponseCode();
if (http_status == 200) {
StringBuilder sb = new StringBuilder();
BufferedReader bfrd = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
String temp = null;
while ((temp = bfrd.readLine()) != null) {
sb.append(temp);
sb.append("\r\n");
}
bfrd.close();
return sb.toString();
} else {
throw new IOException("Http Connection Error: " + http_status);
}
}

沒有留言: