日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JAVA里字符編碼的探索與理解

今天終于把JAVA里一個比較頭痛的問題——字符編碼弄清晰了,所以寫一篇文章來紀念一下,也為大家提供一點自己的心得。

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

定義一個字符串

String name = "堂";

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

char c_name = name.charAt(0);

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

首先看看char里保存的內(nèi)容  

int low = (c_name) & 0xff;//取c_name的低位
  int high = (c_name >> 8) & 0xff;//取c_name的高位
  System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low));

  

結(jié)果是58 02

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

為了方便,我寫了一個輔助方法printbyte,作用是把一個byte數(shù)組的每個元素按照十六進制格式打印出來,同樣為了方便,我把它作為靜態(tài)方法。 

#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);

 

結(jié)果是e5 a0 82 length = 3

哇,三個字節(jié)!看來JAVA內(nèi)部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知?! ?

byte[] utf_16 = name.getBytes("utf-16");
  printbyte(utf_16);

結(jié)果是fe ff 58 02 length = 4,靠,四個字節(jié)了。咦?后面的低16位不正是和開始c_name的十六進制表示一樣的嗎?看來JAVA真正的內(nèi)部字符編碼和UTF-16有或多或少的聯(lián)系。JAVA內(nèi)部究竟是用的什么字符編碼呢?這個問題我也找了很久,后來在THINK IN JAVA 3rd的12章里看到一個例子出現(xiàn)了UTF-16BE,難道是它?  

byte[] utf_16be = name.getBytes("utf-16be");
  printbyte(utf_16be);
  結(jié)果出來了:58 02 length = 2

哈哈,I got it!不多不少兩個字節(jié),內(nèi)容也一樣。果然是它。同時我在里面也看到,UNICODE的編碼還有一個LE,這里的BE,LE我想應(yīng)該是bigendian和littleendian吧。


分享名稱:JAVA里字符編碼的探索與理解
URL分享:http://www.5511xx.com/article/ccssjep.html