20111021

eclipse java 中文亂碼問題

環境:win7
IDE:eclipse Helios Service Release 2

Console預設字集: UTF-8
串流輸入預設編碼:   UTF8
串流輸出預設編碼:   UTF8

問題 :console所輸入的中文字串,無法正確的顯示回console,尚未使用CMD測試
1. 外部已編輯好的UTF8編碼文字檔,可以正確讀出顯示在console
2. 程式內給予初值的字串,可以正確顯示
3. console取得的字串,無法正確的存入外部文字檔,文字檔內容為亂碼
4. 以MS950編碼取得亂碼的位元組,在強制編成UTF8,部分文字可正確顯示


            System.out.println("系統預設編碼: "+Charset.defaultCharset());
            BufferedReader reader=null;
            InputStreamReader stream =new InputStreamReader(System.in);
            reader = new BufferedReader(stream);
            System.out.println("串流預設編碼: "+stream.getEncoding());
            byte[] binary=null;
            String str =null;
            System.out.println(str = reader.readLine());
            reader.close();
            
            
                binary = str.getBytes("UTF-16");
                System.out.println(new String(binary,"UTF-16"));
                System.out.printf("UTF-16: ") ;
                for(byte b:binary){
                    System.out.print(Integer.toHexString(b & 0x00ff) + " ");
                }
                System.out.println();
                binary = str.getBytes("UTF-8");
                System.out.println(new String(binary,"UTF-8"));
                System.out.printf("UTF-8: ");
                for(byte b:binary){
                    System.out.print(Integer.toHexString(b & 0x00ff) + " ");
                }
                System.out.println();
                binary = str.getBytes("MS950");
                System.out.println(new String(binary,"MS950"));
                System.out.printf("MS950: ");
                for(byte b:binary){
                    System.out.print(Integer.toHexString(b & 0x00ff) + " ");
                }
                //某些字串可以用ms950編碼正確顯示
                System.out.println();
                binary = str.getBytes("MS950");
                System.out.println(new String(binary,"UTF8"));
                for(byte b:binary){
                    System.out.print(Integer.toHexString(b & 0x00ff) + " ");
                }
                System.out.println();
                
                //用全部編碼比對
                for (String encoding : Charset.availableCharsets().keySet()) {
                    try{
                         binary = str.getBytes(encoding);
                            System.out.printf("%s %s%n", 
                            encoding, new String(binary, "utf8"));
                    }catch (Exception e) {
                        continue;
                    }
                }

沒有留言: