1. 程式人生 > >Java技術篇·IO包·檔案編碼

Java技術篇·IO包·檔案編碼

一、Java中預設的編碼方式:

編碼問題存在兩個方面:JVM之內和JVM之外。

1、Java檔案編譯後形成class

這裡Java檔案的編碼可能有多種多樣,但Java編譯器會自動將這些編碼按照Java檔案的編碼格式正確讀取後產生class檔案,這裡的class檔案編碼是Unicode編碼(具體說是UTF-16編碼)。

因此,在Java程式碼中定義一個字串:

String s="漢字";

不管在編譯前java檔案使用何種編碼,在編譯後成class後,他們都是一樣的----Unicode編碼表示。

2、JVM中的編碼

JVM載入class檔案讀取時候使用Unicode編碼方式正確讀取class檔案,那麼原來定義的String s="漢字";在記憶體中的表現形式是Unicode編碼。

二、關於文字

1.這個世界上從來沒有純文字這回事,如果你想讀出一個字串,你必須知道它的編碼。如果你不知道一段資料流的編碼方式,你就永遠不會知道這裡面的內容。

2.Unicode是一個簡單的標準,用來把字元對映到數字上。Unicode協會的人會幫你處理所有幕後的問題,包括為新字元指定編碼。我們用的所有字元都在unicode裡面有對應的對映,每個對映稱為一個碼點。

3.Unicode並不告訴你字元是怎麼編碼成位元組的。這是被編碼方案決定的,通過UTF來指定。

三、二進位制與字元的轉換

1.進位制流到螢幕字元的過程:

二進位制流->根據編碼方式解碼出碼點->根據unicode碼點解釋出字元->系統渲染繪出這個字元

2.文字字元儲存到計算機上的過程:

輸入字元->根據字元找到對應碼點->根據編碼方式把碼點編碼成二進位制流->儲存二進位制流到硬碟上

從這個過程我們可以知道能不能從二進位制流讀取出字元關鍵就在於能不能找到二進位制流的編碼,掌握了編碼方式的資訊就可以用對應的逆過程解碼。

四、Java中的文字及編碼

下面以一個程式來說明。

package com.io;

public class encodeTest {

    //unicode指的是一種編碼字符集,即所謂的萬國碼,而UTF-8,UTF-16(LE,BE)都只是針對這種字符集的一種編碼方式。

    public static void main(String[] args) throws Exception{
        String str = "中國CJL";

        //專案預設編碼utf-8,中文佔用3個位元組,英文佔用一個位元組
        byte[] bytes = str.getBytes();
        for (byte b : bytes) {
            System.out.print(Integer.toHexString(b & 0xff) + " ");  //16進位制顯示,和16的與位運算,移除前邊的00000
            //e4 b8 ad e5 9b bd 43 4a 4c
        }

        System.out.println();
        //GBK編碼,中文佔用2個位元組,英文佔用1個位元組
        byte[] bytesGBK = str.getBytes("gbk");
        for (byte b : bytesGBK) {
            System.out.print(Integer.toHexString(b & 0xff) + " ");
            //d6 d0 b9 fa 43 4a 4c
        }

        System.out.println();
        //utf-16be編碼,中文2個位元組,英文2個位元組-Java預設編碼
        byte[] bytesUTF16BE = str.getBytes("utf-16be");
        for (byte b : bytesUTF16BE) {
            System.out.print(Integer.toHexString(b & 0xff) + " ");
            //4e 2d 56 fd 0 43 0 4a 0 4c
        }
    }
}
/*
* 輸出
* e4 b8 ad e5 9b bd 43 4a 4c
* d6 d0 b9 fa 43 4a 4c
* 4e 2d 56 fd 0 43 0 4a 0 4c
* */

說明:以上內容均來自於網際網路及個人整理,如有侵權,請聯絡我。