2012年6月6日 星期三

[記事] URLConnection 與 Encoding

屬於阿宅世界的技術文章,想看的再點開,切莫自誤 !


每隔個幾年就要被問一次,還是寫下來當 memo 好了

起因在於某個白痴...偉大的開發單位寫了個把中文字串放在URL參數中傳的介面,這不打緊,奇妙的是它output吐 utf8 而input 吃 big5,搞得來接的人程式環境設成big5或是utf8都不對,而另一個 白痴...偉大的 開發單位連基本文字編碼轉換都不會,只好寫個小程式跟我們 白痴...偉大的 開發單位說明怎麼執行 orz

public void UrlConnEnc(){
    String chinese_str = "中文字串";
    String url_str;
    BufferedReader br = null;
    try {
        String big5_chinese_str = URLEncoder.encode(chinese_str, "big5");

        url_str = "http://aaa.bbb.ccc/?p=" + big5_chinese_str ;

        URL url = .URL(url_str);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("11.22.33.44", 8080));
        URLConnection uc = url.openConnection(proxy);
        uc.setRequestProperty("User-agent", "IE/6.0");

        br = new BufferedReader(
            new InputStreamReader(uc.getInputStream())
        );
        String line;
        while ((line = br.readLine())!=null) {
            System.out.println(line);
        }

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    } finally {
        try {
            if (br != null) { br.close(); br = null;}
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}


Note:
  1. 專案編碼為 UTF8
  2. 編碼轉換是用偷吃步 : 透過 URLEncoder 這個類別達成
  3. 因為內部出去要走 proxy ,所以程式中必須加上 proxy 設定,用不到的就拿掉
  4. User-agent 這個 Request Property 不是必要的,但另一個維運單位總是自以為在squid檔設個Header沒有Browser info 的條件就可以檔掉來Try的程式,為了避免被檔掉,還是偽裝一下好了
  5. 萬一萬一 Response 的編碼編碼不同呢 ? 把InputStreamReader的傳入參數再加一個編碼就好了
    new InputStreamReader(conn.getInputStream(), encoding)
  6. 最後.....












我絕對不會跟你們說這個 白痴...偉大的開發單位叫 TL. 開發單位總是叫需求單位解決技術問題 ?!  笑死人 !

2 則留言: