首頁 > 軟體

Java中關於字串的編碼方式

2022-06-21 14:10:25

字串的編碼方式

UTF-8是Unicode的一種實現方式,也就是它的位元組結構有特殊要求,所以我們說一個漢字的範圍是0X4E00到0x9FA5,是指unicode值,至於放在utf-8的編碼裡去就是由三個位元組來組織,所以可以看出unicode是給出一個字元的範圍,定義了這個字是碼值是多少,至於具體的實現方式可以有多種多樣來實現。

idea中預設的字串編碼方式為utf-8

System.out.println(System.getProperty("file.encoding"));

更改編碼方式:settings->fileCoding->GlobalEncoding = GBK

輸出結果:

utf-8和GBK中字串所佔用的位元組數

    public static void print(String s) {
        for (byte aByte : s.getBytes()) {
            System.out.println(aByte);
        }
        System.out.println("----------------");
    }

GBK編碼方式下,鍵盤在中文狀態

數位字母佔一個位元組,符號或者中文佔用兩個位元組

    public static void main(String[] args) {
        String s1 = "2";
        print(s1);
        String s2 = ";";
        print(s2);
        String s3 = "方";
        print(s3);
        String s4 = "23f方";
        print(s4);
    }

gbk編碼方式下,鍵盤在英文狀態

字母數位佔,符號用1個位元組,中文佔用兩個位元組

    public static void main(String[] args) {
        String s1 = "2";
        print(s1);
        String s2 = ";";
        print(s2);
        String s3 = "f";
        print(s3);
        String s4 = "23f方";
        print(s4);
    }

utf-8的方式下

中文,中文符號佔用3個位元組,英文符號佔用1個位元組,字母數位佔用1個位元組

    public static void main(String[] args) {
        String s1 = "2";
        print(s1);
        String s2 = ";";
        print(s2);
        String s3 = "方";
        print(s3);
        String s4 = "23f方";
        print(s4);
    }

小結:

  • utf-8下中文中文符號佔用3位元組,英文符號,字母數位佔用1個位元組
  • gbk下中文中文符號佔用2位元組,英文符號,字母數位佔用1個位元組

設定字串編碼、轉碼 

Unicode(統一碼、萬國碼、單一碼)是電腦科學領域裡的一項業界標準,包括字元集、編碼方案等。Unicode 是為了解決傳統的字元編碼方案的侷限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,以滿足跨語言、跨平臺進行文字轉換、處理的要求。1990年開始研發,1994年正式公佈。

Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。目前的Unicode字元分為17組編排,0x0000 至 0x10FFFF,每組稱為平面(Plane),而每平面擁有65536個碼位,共1114112個。然而目前只用了少數平面。UTF-8、UTF-16、UTF-32都是將數位轉換到程式資料的編碼方案。

通用字元集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字元集。UCS-2用兩個位元組編碼,UCS-4用4個位元組編碼。

UTF-8

UTF-8以位元組為單位對Unicode進行編碼。

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼,由Ken Thompson於1992年建立。現在已經標準化為RFC 3629。UTF-8用1到6個位元組編碼Unicode字元。

用在網頁上可以統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。 

UTF-16

UTF-16編碼以16位元無符號整數為單位。

UTF-16是Unicode字元編碼五層次模型的第三層:字元編碼表(Character Encoding Form,也稱為 "storage format")的一種實現方式。即把Unicode字元集的抽象碼位對映為16位元長的整數(即碼元)的序列,用於資料儲存或傳遞。Unicode字元的碼位,需要1個或者2個16位元長的碼元來表示,因此這是一個變長表示。

UTF-16是Unicode的其中一個使用方式。 UTF是 Unicode TransferFormat,即把Unicode轉做某種格式的意思。

它定義於ISO/IEC 10646-1的附錄Q,而RFC2781也定義了相似的做法。

在Unicode基本多文種平面定義的字元(無論是拉丁字母、漢字或其他文字或符號),一律使用2位元組儲存。而在輔助平面定義的字元,會以代理對(surrogate pair)的形式,以兩個2位元組的值來儲存。UTF-16比起UTF-8,好處在於大部分字元都以固定長度的位元組 (2位元組) 儲存,但UTF-16卻無法相容於ASCII編碼。

UTF-32

UTF-32編碼以32位元無符號整數為單位。

Unicode的UTF-32編碼就是其對應的32位元無符號整數。

UTF-32 (或 UCS-4)是一種將Unicode字元編碼的協定,對每一個Unicode碼位使用恰好32位元元。其它的Unicode transformation formats則使用不定長度編碼。因為UTF-32對每個字元都使用4位元組,就空間而言,是非常沒有效率的。特別地,非基本多文種平面的字元在大部分檔案中通常很罕見,以致於它們通常被認為不存在佔用空間大小的討論,使得UTF-32通常會是其它編碼的二到四倍。雖然每一個碼位使用固定長定的位元組看似方便,它並不如其它Unicode編碼使用得廣泛。j 

java中編碼 

String gbkStr = "你好哦!"; //原始碼檔案是GBK格式,或者這個字串是從GBK檔案中讀取出來的, 轉換為string 變成unicode格式
//利用getBytes將unicode字串轉成UTF-8格式的位元組陣列
byte[] utf8Bytes = gbkStr.getBytes("UTF-8"); 
//然後用utf-8 對這個位元組陣列解碼成新的字串
String utf8Str = new String(utf8Bytes, "UTF-8");

簡化後就是:

unicodeToUtf8 (String s) {
return new String( s.getBytes("utf-8") , "utf-8");
}

UTF-8 轉GBK原理也是一樣

return new String( s.getBytes("GBK") , "GBK");

解決編碼亂碼

java 獲取系統中預設的編碼

  //方法一:中文作業系統中列印GBK   
System.out.println(System.getProperty("file.encoding"));   
//方法二:中文作業系統中列印GBK   
System.out.println(Charset.defaultCharset());   

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。 


IT145.com E-mail:sddin#qq.com