เดือนก่อน ลูกค้าเจ้านึงในฝรั่งเศสส่ง issue มาว่า Sever ผม encode ภาษาฝรั่งเศสผิด แปลงตัว é กลายเป็น é ทั้งหมดเลย
สิ่งแรกที่ผมทำคือลอง Google ดูเกี่ยวกับปัญหานี้ ส่วนใหญ่เขาก็จะบอกกันว่าเป็นที่ encoding กันหมด
สิ่งที่สองที่ผมทำคือลอง test กับ server ผมเองว่ามันทำผิดจริงรึเปล่า เท่าที่ลองรัน test page หรือเขียน JavaScript มาลองดูมันก็แสดงผลเป็น é ตรงนี่หว่า -*- ถาม Dev ๆ ก็บอกว่าก็ส่งเป็น UTF-8 นะ สุดท้ายก็เลยลองถามลูกค้าไปว่า “เขาดึงข้อมูลจาก server ผมยังไง” ลูกค้าก็ให้โค๊ดประมาณแนวๆ นี้มา
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//Create JSON POST
JSONObject request_msg = new JSONObject();
request_msg.put("closure", "JAVA_CLIENT");
JSONArray requestArray = new JSONArray();
requestArray.add("language=France");
request_msg.put("request", requestArray);
try {
PrintStream outt = new PrintStream(System.out, true, "UTF-8");
HttpURLConnection urlConn = null;
URL url = new URL("http://server:80/getdata");
urlConn = (HttpURLConnection) url.openConnection();
urlConn.setRequestMethod("POST");
urlConn.setAllowUserInteraction(false);
urlConn.addRequestProperty("Accept", "application/json,text/javascript, */*; q=0.01");
urlConn.addRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
urlConn.addRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
urlConn.addRequestProperty("Accept-Language", "fr-FR,fr;q=0.8,en-US;q=0.8,en;q=0.4");
urlConn.addRequestProperty("Content-Type", "application/json");
urlConn.addRequestProperty("Connection", "keep-alive");
// envoyer des params
urlConn.setDoOutput(true);
// poster les params
PrintWriter paramWriter = new PrintWriter(urlConn.getOutputStream());
paramWriter.print(request_msg.toString());
// fermer le post avant de lire le resultat ... logique
paramWriter.flush();
paramWriter.close();
// Lire la reponse
InputStream resp = urlConn.getInputStream();
BufferedReader bufReader = new BufferedReader(new InputStreamReader(resp));
String sLine;
StringBuilder sb = new StringBuilder();
String lineSep = "###";
while ((sLine = bufReader.readLine()) != null) {
sb.append(sLine);
sb.append(lineSep);
}
out.println(sb.toString());
// deconnection
urlConn.disconnect();
bufReader.close();
out.close();
} catch (Exception e) {
System.out.println("Error " + e.toString());
e.printStackTrace();
}
}
Code ข้างบนนี่จริงๆ ลูกค้าให้มาแค่ส่วนตัว HTTP ส่วน Sevlet ทั้งหลายนี่ผมเขียนเพิ่มเองเพื่อ Test ส่วน Logic การใช้ HttpURLConnection, PrintWriter, Buffer ทั้งหลายนั่นเอา code เขามา ส่วนการส่ง JSON ผมเลือกใช้ simple – json เพราะตอนนั้นไม่รู้ว่า Java support JSON แบบ native แล้ว
Continue reading “Java encoding French Language” →