Java encoding French Language

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

Code ข้างบนนี่ replicate ปัญหาของลูกค้าได้ครับ (รันบน Netbeans) ก็นั่งงงอยู่ตั้งนานเพราะ response.setContentType หรือ urlConn ลูกค้าก็ set ดักไว้หมดแล้วนี่หว่า ตอนแรกจะคิดว่าเป็นที่ Java แล้วด้วยซ้ำ แต่ไปลองใช้ test tool ที่เป็น Java ตัวอื่นก็ทำงานถูกนี่หว่า ….

หลังจากนั่งเพ่ง code นี้อยู่ 1 ครึ่ง ผมก็นึกไงไม่รู้ ไปค้นข้อมูล BufferedReader มาแล้วพบว่ามันใส่ encoding ตอนอ่านได้ สุดท้ายเลยลองแบบนี้ (ยกมาแค่บางส่วนนะ)

// Lire la reponse
InputStream resp = urlConn.getInputStream();
BufferedReader bufReader = new BufferedReader(new InputStreamReader(resp, "UTF-8"));
String sLine;
StringBuilder sb = new StringBuilder();
String lineSep = "###";

แล้วก็แก้ปัญหาของลูกค้าได้ แสดงผลเป็นภาษาฝรั่งเศสได้ถูกต้องสวยงาม ตอบลูกค้ากลับไปลูกค้าลองไปแก้แล้วก็ happy ดี

จาก code ที่ผมแก้ไปนิดเดียวนั้น จริงๆ มันคือ Server ผมส่งข้อมูลออกมาเป็น UTF-8 แล้ว แต่ Code แรกขาอ่านจาก HTTP ไม่ได้อ่านเป็น UTF-8 พวกอักขระพิเศษๆ ของภาษาฝรั่งเศสเลยเพี้ยนไป ซึ่งต่อให้ set response.setContentType ถูกมันก็ไม่ทันแล้ว

ที่น่าเจ็บใจคือ test page ที่ Dev เขียนเป็น Java นั้น จริงๆ code ก็เห็นอยู่จะๆ แล้วว่าตอนอ่าน BufferedReader ต้องใส่ “UTF-8” ไปด้วยแต่ผมมองข้ามไปเอง -*-

Categories: Code, Tech | Tags: , , , , | 2 Comments

Post navigation

2 thoughts on “Java encoding French Language

  1. ถึงแม้ตอนแก้ปัญหาไม่ตกมันอยากจะบ้าตาย แต่พอเสร็จแล้วมาทบทวนดูมันก็รู้สึกดีนะ
    อ่านแล้วรู้สึกสนุกกับงานที่ทำขึ้นอีกมากเลยแฮะ ^_^

  2. Pingback: วิธีสร้าง JSON Message ด้วย Java | Blog It Together

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

Bomreview

โบ้มรีวิว โตแล้วจะรีวิวอะไรก็ได้

rerng.rak

Just another WordPress.com weblog

neizod

Smile! You’re at the best WordPress.com site ever

Admod's blog

just logs

freeclub

พยายามเขียนให้ยาวกว่าเฮดเดอร์ข้างบนจะได้ดูสวยๆ

Anontawong's Musings

a daily dose of a new perspective

TravelKanuman

Travel around the world

kemisara

Belle Kemisara Paladesh's Fan Site - เว็บไซต์แฟนคลับเบลล์ เขมิศรา พลเดช

eatandysummers

eat. travel. live.

Jonathan Fleming's Blog

A Photography Blog

Viewfinder - Street Photography Blog

Jimmy Yang Street Photography Blog

PinkiiGirl

Be one of those who change things and push the human race forward

บล็อกอะไรไม่รู้ของแบม

Ordinary guy blogging about comic books, video games, movies and stuffs.

Pawoot Personal Blog & Think Tank

E-Business Man Daily Life and What I'm Thinking

Mahalarp

journeys & musics never ended ...

Tyson Robichaud Photo-blography

Tips, tricks, reviews and general rambling.

%d bloggers like this: