เดือนก่อน ลูกค้าเจ้านึงในฝรั่งเศสส่ง 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”