論編碼與解碼

一、字符串的編碼和解碼java

如下是對字符串進行編碼:編碼

//Convert from String to byte[]:

    		String s = "中國";
    		byte[] b = s.getBytes("UTF-8");
    		for(byte i:b){
    			System.out.print(i+",");	
    		}

輸出:code

-28,-72,-83,-27,-101,-67,

如何解碼:(解碼時首先要明白是採用什麼方式編碼的) 如上咱們知道採用UTF-8格式進行編碼的,那麼就採用UTF-8格式進行解碼:utf-8

//Convert from byte[] to String:
    		byte[]  t = {-28,-72,-83,-27,-101,-67};
    		String  tt = new String(t,"UTF-8");
    		System.out.println(tt);

輸出:字符串

中國

假如咱們解碼的時候採用GBK進行解碼,就會出現亂碼:get

//Convert from byte[] to String:
    		byte[]  t = {-28,-72,-83,-27,-101,-67};
    		String  tt = new String(t,"GBK");
    		System.out.println(tt);

以上採用GBK方式進行解碼,出現亂碼,輸出爲:string

涓浗

注意事項it

1.控制檯的輸出也會有對應的編碼格式,這個編碼格式是支持輸出的字符串的顯示的編碼。好比UTF-8表明中文的輸出也能夠打印,若是改成:ISO-8859-1,中文就沒法顯示了,由於,ISO-8859-1沒法對中文進行編碼。 2.因此控制檯儘可能採用UTF-8格式,這樣幾乎全部的輸出都可以看到。io


理論上經過經過編碼格式A編碼,再經過編碼格式A解碼,就不會出現亂碼。注意:前提是編碼格式A必必須可以進行編碼和解碼。若是A不可以進行編碼,即便經過A進行解碼也會出現亂碼。字符編碼

舉個例子: 你是一個廚師,只會對蔬菜、水果、肉類這三種物品進行作菜。

這時候給你:蘋果、橘子、白菜、蘿蔔、豬肉、羊肉你均可以進行分類,再給你一個 屠龍刀,你傻了。這屠龍刀是哪個分類?如何作菜?

這時候你的分類爲: 、

蔬菜:白菜、蘿蔔 肉類:豬肉、羊肉 水果類:橘子、蘋果

??? :屠龍刀

屠龍刀你不知道怎麼辦,就打了三個大大的問號 ??? 因此就會出現亂碼了:

下面我舉個例子:灰常形象:

//Convert from String to byte[]:
    		String s = "中國";
    		byte[] b = s.getBytes("big5");
    		for(byte i:b){
    			System.out.print(i+",");	
    		}
    		System.out.println();
    		//Convert from byte[] to String:
    		String  tt = new String(b,"big5");
    		System.out.println(tt);

輸出:

-92,-92,63,
中?

分析輸出結果 用big5編碼再用big5解碼爲何會輸出 「中?」呢

就是由於 "國" 在big5編碼格式中不能順利編碼,就是big5編碼格式中不能對 「國」 字進行編碼,因此亂碼了。

若是改成GBK或者UTF-8就能夠了,由於GBK或者UTF-8可以順利對 「國」 字進行編碼和解碼 以下:

//Convert from String to byte[]:
    		String s = "中國";
    		byte[] b = s.getBytes("GBK");
    		for(byte i:b){
    			System.out.print(i+",");	
    		}
    		System.out.println();
    		//Convert from byte[] to String:
    		String  tt = new String(b,"GBK");
    		System.out.println(tt);

輸出結果:

-42,-48,-71,-6,
中國

總結: 不出現亂碼的幾個條件 一、編碼格式可以兼容對應的 被編碼者 二、在第一條的基礎上,用A編碼格式編碼就要用A編碼格式進行解碼。 三、輸出的結果和對應的平臺也要支持對應的編碼格式

兩種編碼格式都可以兼容的,採用A編碼格式編碼,再用B編碼格式解碼也能夠正常顯示,由於A、B都兼容,若是常規的ASCII編碼, LFFFFF1112中111111


這種方式嚴重不建議,沒啥意義

//Convert from String to byte[]:
    		String s = "LFFFFF1112中111111";
    		byte[] b = s.getBytes("gb2312");
    		
    		for(byte i:b){
    			System.out.print(i+",");	
    		}
    		
    		System.out.println();
    		//Convert from byte[] to String:
    		String  tt = new String(b,"UTF-8");
    		System.out.println(tt);

輸出:除了中文部分,都可以正常顯示,由於中文部分gb2312和UTF-8不是採用同一種編碼格式

76,70,70,70,70,70,49,49,49,50,-42,-48,49,49,49,49,49,49,
LFFFFF1112��111111

說明幾點 一、工做空間的編碼格式,只是表明你編寫程序的時候能夠輸入的編碼,好比UTF-8就表明 String a = "你好" 可以正常顯示,若是你把工做空間編碼格式修改成:ISO-8859-1,你們都知道ISO-8859-1不支持中文,這樣就會顯示亂碼: String a = "你好" ;但最好設置爲UTF-8由於可以輸入任何形式的內容。

二、控制檯輸出的編碼格式也能夠調,但最好設置爲UTF-8格式,由於你可以輸出任何形式的內容

引用文章:

字符串編碼 stackoverflow 如何從一種編碼格式轉換爲另一種編碼格式 字符編碼之間的轉換

相關文章
相關標籤/搜索