亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java字節與字符有什么區別

發布時間:2020-07-22 09:04:17 來源:億速云 閱讀:136 作者:小豬 欄目:開發技術

這篇文章主要講解了java字節與字符有什么區別,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

一、字節

        所謂字節(Byte),是計算機數據存儲的一種計量單位。一個二進制位稱為比特(bit),8個比特組成一個字節,也就是說一個字節可以用于區分256個整數(0~255)。由此我們可以知道,字節本是面向計算機數據存儲及傳輸的基本單位,后續的字符也就是以字節為單位存儲的,不同編碼的字符占用的字節數不同。

        那么在Java中,除了存儲的意義外,Java還將字節Byte作為一種基本數據類型,該數據類型在內存中占用一個字節,用于(-128~127)范圍內的整數

byte a = -128;
byte b = 127;

       總的來說,字節在Java中有兩種含義:

       存儲的單位Java的數據類型,用于表示-128~127范圍的整數

二、字符

       計算機底層存儲的是字節,字符的設計則是用于展示符號。屏幕上顯示的各種文字,數字,符號等就是解碼的字符。所以我們說字符是用來顯示的符號,它將存儲的字節轉換成人們看得懂的符號,因此字符的核心就是定義字節與展示符號之間的關系,這種映射關系通常也叫做編碼。

2.1、編碼的由來

         為什么要編碼呢?前面我們知道數據都是以字節為單位存儲在計算機中,字節可以區分256個整數,最容易想到的就是將這256個整數定義為256種狀態并分別對應256個字符。但是人類符號太多了,256種是不夠的。所以人們想到將多個字節合并起來表示人類語言符號,編碼的問題就轉化成了字節的組合問題。

2.2、編碼的常見格式

        如今有很多編碼格式,常見的如ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16等等。

ASCII編碼是最基礎的編碼格式,標準的ASCII碼一共有128個,占用字節的低7位,將英語系語種的符號都能覆蓋住,但是總的來說能表示的字符還是非常有限。

ISO-8859-1編碼是ASCII編碼的一種擴展,它用了字節的8位,能表示256種字符,且向下兼容ASCII,包含了絕大多數的西歐符號。

GB2312是雙字節編碼,意味著它使用兩個字節來表示符號,包含有6763個漢字。

GBK是GB2312的一個擴展,也是雙字節編碼,能夠表示21003個漢字,且向下兼容GB2312。

...

       編碼的規范越來越多,不同語言的國家都定義了自己的語言符號編碼標準,一時間編碼標準百花齊放,在互聯網的時代里交流十分不便,不同編碼體系之間的信息交流都需要采用不同的解碼方案,不然就會出現亂碼的現象。于是國際標準化組織ISO制定了一個能夠容納世界上所有文字和符號的字符編碼方案Unicode。Unicode是一個字符集,它規定了人類所有字符對應的二進制數,至于這個二進制數怎么存儲則是由開發者來進行實現。其中比較流行的實現是UTF-8和UTF-16,還有一種UTF-32。

UTF-32編碼使用4個字節,也就是32位二進制存儲Unicode字符,效率高但是空間浪費。

UTF-8編碼是一種變長的編碼方式,它使用1~6個字節來存儲,對于英語系的字符使用一個字節,向下兼容ASCII,對于漢字則使用兩個字節,依次類推,這樣就能夠節省一定的空間。

UTF-16編碼是介于兩者之間的一種編碼方式。對于部分字符采用2個字節,另一部分字符采用4個字節。因此UTF-16無法兼容ASCII。

在平時的使用中,UTF-8的使用還是比較多,就是由于它既能向下兼容ASCII,還能夠在一定程度上節省空間。

2.3、Java IO流中的編碼和解碼

        Java中是如何進行編碼和解碼的呢?我們知道,編碼/解碼的過程主要是發生在字符與字節之間轉換的過程。在展示字符的時候,我們將內存中的字節解碼成符號,在存儲或者傳輸文件時,我們將字符編碼位字節數據。解碼

       解碼的過程是將字節轉換為字符,也就是我們在讀取文件或者網絡數據的過程。

       在java中,我們通過FileReader讀取文件數據,FileReader繼承自InputStreamReader。在InputStreamReader中使用了解碼器StreamDecoder。

// InputStreamReader.java
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import sun.nio.cs.StreamDecoder;

public class InputStreamReader extends Reader {
  // 解碼器,按照指定編碼方式將字節轉換成字符
 private final StreamDecoder sd;

  // 通過dec指定解碼器使用的編碼方案
 public InputStreamReader(InputStream in, CharsetDecoder dec){
  super(in);
  if (dec == null)
   throw new NullPointerException("charset decoder");
  sd = StreamDecoder.forInputStreamReader(in, this, dec);
 }
  
  // 讀字符,以int形式(4字節)返回字符
 public int read() throws IOException {
  return sd.read();
 }

}

       通過上述InputStreamReader源碼我們可以知道:

       讀取輸入流時,通過StreamDecoder完成字節到字符的轉換可以通過構造方法來設置編碼方案讀取的字符以int型數據返回,即4個字節

       另外,上述列舉只是源碼的一部分,我們設置編碼方案有很多種形式,如在構造方法種傳入編碼方式的String類型名稱、傳入CharSet類型的字符集以及上述的CharsetDecoder類型的字符解碼方式。如果不傳入編碼方案,則默認為當前環境的編碼方案。編碼

      與解碼類似,在存儲文件或者寫入數據的時候,我們將字符轉換為字節,寫入文件或者網絡。

      在java種,我們通過FileWriter來寫入文件,FileWriter繼承自OutputStreamWriter。在OutputStreamWriter種使用了編碼器StreamEncoder。

// OutputStreamWriter.java
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import sun.nio.cs.StreamEncoder;

public class OutputStreamWriter extends Writer {
 // 編碼器,按照指定編碼方式將字符轉換成字節
 private final StreamEncoder se;

 // 通過enc指定編碼方案
 public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {
  super(out);
  if (enc == null)
   throw new NullPointerException("charset encoder");
  se = StreamEncoder.forOutputStreamWriter(out, this, enc);
 }
 
 // 寫字符,寫入的字符以int類型傳入
 public void write(int c) throws IOException {
  se.write(c);
 }

      通過源碼我們可以知道:

  • 寫入輸出流時,通過StreamEncoder完成字符到字節的轉換
  • 通過構造方法指定編碼方案
  • 寫入的字符都是int類型

看完上述內容,是不是對java字節與字符有什么區別有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

若尔盖县| 板桥市| 理塘县| 淳安县| 山东省| 万年县| 老河口市| 汾西县| 南华县| 虹口区| 兴海县| 佛山市| 荃湾区| 宿迁市| 十堰市| 高陵县| 石景山区| 徐州市| 漳平市| 义马市| 色达县| 盐源县| 南川市| 长宁县| 甘洛县| 万宁市| 横峰县| 青浦区| 静宁县| 江津市| 阳谷县| 遵化市| 彭山县| 奉贤区| 靖远县| 斗六市| 诏安县| 南溪县| 扎赉特旗| 全州县| 景泰县|