java的字元集
⑴ java中字元集什麼意思
Java 中字元串在內核中使用 Unicode,也就是說每個字元 JVM 只記錄它的 Unicode Code Point,只有在網路傳輸或保存到磁碟上時才需要把它轉換成特定的字元集的編碼,這個字元集就是把一個 Unicode Code Point 整數翻譯成一串 byte[],因為在網路或磁碟上,位元組是一個一個排列的,我們需要知道把高位位元組排前面還是排後面並且容易推斷出哪個哪個位元組是一個字元的邊界,這樣才能把相關的幾個位元組還原成一個字元而不是把第2個字元的後面半數位元組和第3個字元的前面半數的位元組拼在一起出一個怪異的字元,我們以前在早期的電腦游戲中不支持雙位元組漢語時我們經常碰到這個問題,那就是先輸入一個漢字,在內存中有2個位元組,然後我們按一下 backspace 軟體只刪除一個位元組,我們再輸入一個漢字之後一共有3個位元組的,這時我們用一個支持漢字的軟體來查看這個文字可能是第1個剩下的位元組和後面的字元的第1位元組拼起來剛好又是另一個漢字,而剩下的第3個位元組就不是有意義的繪圖符號。
當不需要把 JVM 內存中的字元傳輸到網路外或磁碟上或列印出來的時候,我們是不需要知道字元集的,在顯示在圖形界面上時JVM知道怎麼把它們顯示出來,現在的 Windows 操作系統同樣也是 Unicode 內核的,也就是說我們只要說明 Unicode Code Point 它應該知道是什麼字元,那麼只剩下字體這邊是否也是用 Unicode Code Point 來對應一個字元啦(這個我不確定,但估計也是),如果操作系統和字元這邊也是按 Unicode Code Point 來對應,那麼當我們不保存到磁碟或發送出網路時是完全不需要知道有字元集這回事的。
下面這個例子中處理一個 Unicode 6.0 新標准中收錄的漢字,你看到 UTF-8, UTF-16, GB18030 支持它們,但 GB2312 沒有收錄這個漢字,所以出個問號,也就是我們學說的亂碼啦。
什麼是 Unicode,下面這樣的表格就是 Unicode,而那些坐標數字就是 Code Point.
⑵ Java: 如何知道一個字元串當前是什麼字元集
判斷java字元串的字元集有多種方法,我們一一討論如下:
1、通過把未知編碼字元串,用猜想的編碼再解碼,觀察字元串是不是正確還原了。
原理:假如目標編碼沒有數組中的字元,那麼編碼會破壞,無法還原。
缺點:假如字元少,而正巧錯誤的猜想編碼中有這種位元組,就會出錯。
如:new String("tested str".getBytes("enc"),"enc")
2、大多數時候,我們只要判斷本地平台編碼和utf8,utf8編碼相當有規律,所以可以分析是否是utf8,否則使用本地編碼。
原理:分析byte[]來判斷規律。
缺點:有時,個別本地編碼位元組在utf8中也會出現,導致出錯,需要分析。
如:判斷是否utf-8代碼:
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte>=0) continue;//>=0 is normal ascii
if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;
int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4
:lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;
if(i+lCount>lLen) return false;
for(int j=0;j=(byte)0xc0) return false;
}
return true;
}
3.按編碼規則,一字字比照。
優點是錯物更少,缺點是太費資源。
⑶ Java中如何查看字元串是什麼字元集
判斷java字元串的字元集有多種方法,我們一一討論如下:
1、通過把未知編碼字元串,用猜想的編碼再解碼,觀察字元串是不是正確還原了。
原理:假如目標編碼沒有數組中的字元,那麼編碼會破壞,無法還原。
缺點:假如字元少,而正巧錯誤的猜想編碼中有這種位元組,就會出錯。
如:new String("tested str".getBytes("enc"),"enc")
2、大多數時候,我們只要判斷本地平台編碼和utf8,utf8編碼相當有規律,所以可以分析是否是utf8,否則使用本地編碼。
原理:分析byte[]來判斷規律。
缺點:有時,個別本地編碼位元組在utf8中也會出現,導致出錯,需要分析。
如:判斷是否utf-8代碼:
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte>=0) continue;//>=0 is normal ascii
if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;
int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4
:lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;
if(i+lCount>lLen) return false;
for(int j=0;j=(byte)0xc0) return false;
}
return true;
⑷ Java語言使用的是Unicode字元集,每個字元在內存中佔8位。請問是對還是錯
這句話是錯的,Unicode字元集每個字元在內存里佔2byte,也就是16位(bit)
⑸ Java為什麼選擇unicode字元集
java中的字元就是指char類型的變數,無論中文還是英文,都是佔2個位元組,因為都是用Unicode編碼,一個Unicode編碼就是16位,也就是2個位元組。
所以
char a='中';
char b='e';
都是合法的
substring 處理的最小單元就是一個字元,也就是一個char類型,2個位元組
⑹ java以二進制傳輸字元集填啥
用UTF-8.
java讀寫文件的有很多種方式,基本都是採用java.io的inputStream和各種基於inputstream的封裝實現對文件的讀寫,最原始的介面提供的便是基於byte的讀寫,而String可以看做是char[],一個char是8個byte。在最原始的ASCII編碼中,我們採用一個位元組 也就時8位來表示一個字元(圖形字元或者控制字元),而後來1個位元組不足以表示現實中的所有字元,於是出現了各種各樣的編碼格式,常見的比如UTF-8,GBK,UNICODE等。java中的string也是遵循jre中定義的默認字元集(基本為UTF-8),而在byte[]轉化成String的過程中可能會由於編碼字元集問題導致String逆向回來的byte[]與原來的數組不一致。
⑺ java輸入輸出流字元集怎麼設
1. InputStream 和OutputStream,兩個是為位元組流設計的,主要用來處理位元組或二進制對象,
2. Reader和 Writer.兩個是為字元流(一個字元占兩個位元組)設計的,主要用來處理字元或字元串.
字元流處理的單元為2個位元組的Unicode字元,分別操作字元、字元數組或字元串,而位元組流處理單元為1個位元組,操作位元組和位元組數組。所以字元流是由Java虛擬機將位元組轉化為2個位元組的Unicode字元為單位的字元而成的,所以它對多國語言支持性比較好!如果是音頻文件、圖片、歌曲,就用位元組流好點,如果是關繫到中文(文本)的,用字元流好點
所有文件的儲存是都是位元組(byte)的儲存,在磁碟上保留的並不是文件的字元而是先把字元編碼成位元組,再儲存這些位元組到磁碟。在讀取文件(特別是文本文件)時,也是一個位元組一個位元組地讀取以形成位元組序列
1,位元組流可用於任何類型的對象,包括二進制對象,而字元流只能處理字元或者字元串;
2,位元組流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字元,而字元流就可以
位元組流是最基本的,所有的InputStrem和OutputStream的子類都是,主要用在處理二進制數據,它是按位元組來處理的 但實際中很多的數據是文本,又提出了字元流的概念,它是按虛擬機的encode來處理,也就是要進行字元集的轉化 這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯 在實際開發中出現的漢字問題實際上都是在字元流和位元組流之間轉化不統一而造成的.
⑻ Java中字元集有哪些呢
字元集(character set)是一個系統支持的所有抽象字元的集合。字元(character)就是各種文字和符號,包括國家文字、標點符號、圖形符號、數字等。
如果僅僅是抽象的字元集,其實是顧名思義的,但是我們常說的字元集,其實是指編碼字元集(coded character set),比如: Unicode、ASCII、GB2312、GBK等等。什麼是編碼字元集呢?編碼字元集是指,這個字元集里的每一個字元,都對應到唯一的一個代碼值,這些代碼值叫做代碼點(code point),可以看做是這個字元在編碼字元集里的序號,字元在給定的編碼方式下的二進制比特序列稱為代碼單元(code unit)。在Unicode字元集中,字母A對應的數值是十六進制下的0041,書寫時前面加U+,所以Unicode里A的代碼點是U+0041。
常見的編碼字元集有:
Unicode:也叫統一字元集,它包含了幾乎世界上所有的已經發現且需要使用的字元(如中文、日文、英文、德文等)。
ASCII:早期的計算機系統只能處理英文,所以ASCII也就成為了計算機的預設字元集,包含了英文所需要的所有字元。
GB2312:中文字元集,包含ASCII字元集。ASCII部分用單位元組表示,剩餘部分用雙位元組表示。
GBK:GB2312的擴展,完整包含了GB2312的所有內容。
GB18030:GBK字元集的超集,常叫大漢字字元集,也叫CJK(Chinese,Japanese,Korea)字元集,包含了中、日、韓三國語言中的所有字元。
學習相關java類知識,推薦來北京尚學堂,優秀的師資和科學的授課方式,會帶給你完美的學習體驗。
⑼ Java中的字元採用的是兩個位元組編碼的什麼字元集。
java平台採用UTF-16(Unicode)編碼,一個字元佔2個位元組(不論英文,還是中文字元)。