程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中文問題詳解,底層編碼解剖

Java中文問題詳解,底層編碼解剖

編輯:關於JAVA

預備知識:

1.字節和unicode

Java內核是unicode的,就連class文件也是,但是很多媒體,包括文件/流的保存方式是使用字節流的。 因此Java要對這些字節流經行轉化。char是unicode的,而byte是字節.Java中byte/char互轉的函數在sun.io的包中間有。其中ByteToCharConverter類是中調度,可以用來告訴你,你用的Convertor。其中兩個很常用的靜態函數是。




public static ByteToCharConverter getDefault() ;

public static ByteToCharConverter getConverter(String encoding);

如果你不指定converter,則系統會自動使用當前的Encoding,GB平台上用GBK,EN平台上用8859_1

我們來就一個簡單的例子:

"你"的gb碼是:0xC4E3 ,unicode是0x4F60

你用:



encoding="gb2312";

byte b[]={(byte)'\u00c4',(byte)'\u00E3'};

convertor=ByteToCharConverter.getConverter(encoding);

char [] c=converter.convertAll(b);

for(int i=0;i
{

***.out.println(Integer.toHexString(c[i]));

}

打印出來是0x4F60

但是如果使用8859_1的編碼,打印出來是

0x00C4,0x00E3

例1

反過來:



encoding="gb2312";

char c[]={'\u4F60'};

convertor=ByteToCharConverter.getConverter(encoding);

byte [] b=converter.convertAll(c);

for(int i=0;i
{

***.out.println(Integer.toHexString(b[i]));

}

打印出來是:0xC4,0xE3

例2

如果用8859_1就是0x3F,?號,表示無法轉化 

很多中文問題就是從這兩個最簡單的類派生出來的。而卻有很多類不直接支持把Encoding輸入,這給我們帶來諸多不便。很多程序難得用encoding了,直接用default的encoding,這就給我們移植帶來了很多困難

2.UTF-8

UTF-8是和Unicode一一對應的,其實現很簡單

7位的Unicode: 0 _ _ _ _ _ _ _

11位的Unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _

16位的Unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _

21位的Unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _

大多數情況是只使用到16位以下的Unicode:

你"的gb碼是:0xC4E3 ,unicode是0x4F60

我們還是用上面的例子

例1:0xC4E3的二進制:

1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1

由於只有兩位我們按照兩位的編碼來排,但是我們發現這行不通,

因為第7位不是0因此,返回"?"

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved