<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ゞ沉默是金ゞ

    魚離不開水,但是沒有說不離開哪滴水.
    posts - 98,comments - 104,trackbacks - 0
             今天把JAVA里一個比較頭痛的問題“字符編碼”研究了一下,分享一下。

      眾所周知,JAVA為了國際通用,用的是UNICODE來保存里面的字符。而UNICODE只是一個種字符集,字符的存儲和表示要用到一定的字符編碼格式,而與UNICODE對應的字符編碼格式就是我們??吹降腢TF-8,UTF-16等等,而UTF-8是最常用的,所以人們常常把它和UNICODE等同起來,這在某些情況下是沒有錯的,但這樣的理解在JAVA里就會產生一些混淆。我們用下面的程序來演示一下。

      定義一個字符串

      String name = "堂";

      這個字符串就一個字符,把它取出來

      char c_name = name.charAt(0);

      JAVA里的char型是十六位的(兩個字節),但是如果是用UTF-8的話可能會不只兩位(UTF-8是變長存儲的),那看來JAVA本身并不是用UTF-8來保存的,口說無憑,做個實驗吧。

      首先看看char里保存的內容  
    int low = (c_name) & 0xff;//取c_name的低位
    int high = (c_name >> 8) & 0xff;//取c_name的高位
    System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low));
      結果是58 02

      只有兩個字節而已(16位),那么真正的UTF-8編碼的內容是什么呢,再看看吧。

      為了方便,我寫了一個輔助方法printbyte,作用是把一個byte數組的每個元素按照十六進制格式打印出來,同樣為了方便,我把它作為靜態方法?!?/p>

     public static void printbyte(byte[] bt)
     {
          for (int i = 0; i < bt.length; i++)
          {
                  int hex = (int)bt[i] & 0xff;
                  System.out.print(Integer.toHexString(hex) + " ");
          }
          System.out.println(" length = "+bt.length);
     }


     byte[] utf_8 = name.getBytes("utf-8");
     printbyte(utf_8);

      結果是e5 a0 82 length = 3

      哇,三個字節!看來JAVA內部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知。  
    byte[] utf_16 = name.getBytes("utf-16");
    printbyte(utf_16);
      結果是fe ff 58 02 length = 4,靠,四個字節了。咦?后面的低16位不正是和開始c_name的十六進制表示一樣的嗎?看來JAVA真正的內部字符編碼和UTF-16有或多或少的聯系。JAVA內部究竟是用的什么字符編碼呢?這個問題我也找了很久,后來在THINK IN JAVA 3rd的12章里看到一個例子出現了UTF-16BE,難道是它?  
    byte[] utf_16be = name.getBytes("utf-16be");
    printbyte(utf_16be);
    結果出來了:58 02 length = 2
      哈哈,I got it!不多不少兩個字節,內容也一樣。果然是它。同時我在里面也看到,UNICODE的編碼還有一個LE,這里的BE,LE我想應該是bigendian和littleendian吧。

        附上全代碼:
        

    public class CodeTest {
        
    public static void printbyte(byte[] bt) {
            
    for (int i = 0; i < bt.length; i++{
                
    int hex = (int) bt[i] & 0xff;
                System.out.print(Integer.toHexString(hex) 
    + " ");
            }

            System.out.println(
    " length = " + bt.length);
        }


        
    public static void main(String[] args) throws Exception {
            String name 
    = "";
            
    char c_name = name.charAt(0);
            
            System.out.println(c_name);
    // JAVA里的char型是十六位的(兩個字節)
            
            
    int low = (c_name) & 0xff;// 取c_name的低位
            int high = (c_name >> 8& 0xff;// 取c_name的高位
            System.out.println(Integer.toHexString(high) + " "
                    
    + Integer.toHexString(low));  //58 2
            
            
    byte[] utf_8 = name.getBytes("utf-8");
            printbyte(utf_8);  
    //e5 a0 82  length = 3
            
            
    byte[] utf_16 = name.getBytes("utf-16"); 
            printbyte(utf_16);  
    //fe ff 58 2  length = 4
            
            
    byte[] utf_16be = name.getBytes("utf-16be"); 
            printbyte(utf_16be); 
    //58 2  length = 2
            
            
    byte[] utf_16le = name.getBytes("utf-16le");
            printbyte(utf_16le); 
    // 2 58  length = 2
        }

    }
    posted on 2008-12-30 14:53 ゞ沉默是金ゞ 閱讀(221) 評論(0)  編輯  收藏 所屬分類: Java SE
    主站蜘蛛池模板: 2019中文字幕免费电影在线播放 | 免费一看一级毛片全播放| 日韩电影免费观看| 污视频网站免费观看| 国产精品久久亚洲不卡动漫| 亚洲国产精品嫩草影院在线观看| www亚洲精品少妇裸乳一区二区| 无码国产精品一区二区免费虚拟VR| 亚在线观看免费视频入口| 国产日韩AV免费无码一区二区三区| 亚洲欧美熟妇综合久久久久| 亚洲欧洲日产国码在线观看| 亚洲成AV人片在线播放无码| 亚洲人成电影在线播放| 免费一区二区视频| 国产人成免费视频| 国产在线观看免费视频播放器| 中国在线观看免费高清完整版| 1a级毛片免费观看| 99精品国产成人a∨免费看| 国产无遮挡裸体免费视频在线观看| 久久久精品视频免费观看 | 午夜成人免费视频| 久久WWW色情成人免费观看| 亚洲免费中文字幕| 99久久精品免费精品国产| 免费网站看av片| 光棍天堂免费手机观看在线观看| 国产精品玖玖美女张开腿让男人桶爽免费看 | 亚洲人成伊人成综合网久久| 亚洲男女性高爱潮网站| 亚洲精品国产福利在线观看| 亚洲区视频在线观看| 亚洲剧情在线观看| 亚洲精品二三区伊人久久| 国产成人亚洲综合网站不卡| 中文字幕乱码亚洲无线三区| 亚洲第一成年网站视频| 精品成人一区二区三区免费视频| 一区二区免费国产在线观看 | 亚洲国产成人VA在线观看|