1、使用字節流讀寫文本文件算法
一、使用InputStream 抽象類的一個子類FileInputStream 將文件中的數據輸入到內部存儲器(簡稱內存)中編程
注意:瀏覽器
一、read() 方法返回整數,若是讀取的是字符串,須要強制類型轉換編程語言
二、流對象使用後要關閉字體
輸出的是字符對應的ASCII 編碼
當你輸入的是漢字的時候,發現一個漢字佔有3 個字節,打印的數字大於 127 (ASCII 是從0 到 127 的),不是一直說漢字佔用兩個字節嗎,那麼這是咋個回事來?操作系統
由於,在UTF-8中,爲了節約空間,也爲了兼容ASCII編碼系統,將Unicode中本來用2個字節表示的字符表示成1~4個字節(具體轉換規則在這裏不贅述了),其中大多數漢字部分(好比「波」)在UTF-8中爲3字節,可是在中國大陸地區,GBK編碼依然很經常使用,在GBK中,除ASCII字符外,都是一個字符佔兩個字節。因此,一個漢字佔多少字節仍是具體取決於編碼。設計
ASCII(發音: /ˈæski/ ASS-kee[1],American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統。它主要用於顯示現代英語,而其擴展版本延伸美國標準信息交換碼則能夠部分支持其餘西歐語言,並等同於國際標準ISO/IEC 646。code
共有128 個字符,其中33個字符且沒法顯示多數都已經是陳廢的控制字符。控制字符的用途主要是用來操控已經處理過的文字。在33個字符以外的是95個可顯示的字符。orm
注意:用鍵盤敲下空白鍵所產生的空白字符也算1個可顯示字符(顯示爲空白)。
95個可顯示的字符
Unicode(中文:萬國碼、國際碼、統一碼、單一碼)是計算機科學領域裏的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦能夠用更爲簡單的方式來呈現和處理文字。伴隨着通用字符集的標準而發展,同時也以書本的形式對外發表。Unicode 至今仍在不斷增修,每一個新版本都加入更多新的字符。當前最新的版本爲2020年3月公佈的13.0.0,已經收錄超過13萬個字符(第十萬個字符在2005年獲採納)。Unicode涵蓋的數據除了視覺上的字形、編碼方法、標準的字符編碼外,還包含了字符特性,如大小寫字母。
特色:
Unicode發展由非營利機構統一碼聯盟負責,該機構致力於讓 Unicode 方案取代既有的字符編碼方案。由於既有的方案每每空間很是有限,亦不適用於多語環境。
Unicode備受承認,並普遍地應用於電腦軟件的國際化與本地化過程。有不少新科技,如可擴展置標語言(Extensible Markup Language,簡稱:XML)、Java編程語言以及現代的操做系統,都採用Unicode編碼。
起源:
爲了解決傳統的字符編碼方案的侷限而產生的,例如ISO 8859-1所定義的字符雖然在不一樣的國家中普遍地使用,但是在不一樣國家間卻常常出現不兼容的狀況。不少傳統的編碼方式都有一個共同的問題,即允許電腦處理雙語環境(一般使用拉丁字母以及其本地語言),但卻沒法同時支持多語言環境(指可同時處理多種語言混合的狀況)。在文字處理方面,統一碼爲每個字符而非字形定義惟一的代碼(即一個整數)。換句話說,統一碼以一種抽象的方式(即數字)來處理字符,並將視覺上的演繹工做(例如字體大小、外觀形狀、字體形態、文體等)留給其餘軟件來處理,例如網頁瀏覽器或是文字處理器。
當前,幾乎全部電腦系統都支持基本拉丁字母,並各自支持不一樣的其餘編碼方式。Unicode爲了和它們相互兼容,其首 256 個字符保留給 ISO 8859-1 所定義的字符,使既有的西歐語系文字的轉換不需特別考量;而且把大量相同的字符重複編到不一樣的字符碼中去,使得舊有紛雜的編碼方式得以和Unicode編碼間互相直接轉換,而不會丟失任何信息。舉例來講,全角格式區段包含了主要的拉丁字母的全角格式,在中文、日文、以及韓文字形當中,這些字符以全角的方式來呈現,而不以常見的半角形式顯示,這對豎排文字和等寬排列文字有重要做用。
在表示一個 Unicode 的字符時,一般會用「U+」而後緊接着一組十六進制的數字來表示這一個字符。在基本多文種平面(英語:Basic Multilingual Plane,簡寫 BMP。又稱爲「零號平面」、plane 0)裏的全部字符,要用四個數字(即兩個byte,共16 bits,例如 U+4AE0,共支持六萬多個字符);在零號平面之外的字符則須要使用五個或六個數字。舊版的 Unicode 標準使用相近的標記方法,但卻有些微小差別:在 Unicode 3.0 裏使用「U-」而後緊接着八個數字,而「U+」則必須隨後緊接着四個數字。
Unicode標準
Unicode 自版本 2.0 開始保持了向後兼容,即新的版本僅僅增長字符,原有字符不會被刪除或改名。統一碼聯盟在 1991 年首次發佈了 The Unicode Standard。Unicode 的開發結合了國際標準化組織所制定的 ISO/IEC 10646,即通用字符集。Unicode 與 ISO/IEC 10646 在編碼的運做原理相同,但 The Unicode Standard 包含了更詳盡的實現信息、涵蓋了更細節的主題,諸如比特編碼(bitwise encoding)、校對以及呈現等。The Unicode Standard 也枚舉了諸多的字符特性,包含了那些必須支持兩種閱讀方向的文字(由左至右或由右至左的文字閱讀方向,例如阿拉伯文是由右至左)。Unicode 與 ISO/IEC 10646 這兩個標準在術語上的使用有些微的不一樣。在 2005 年,Unicode 的第十萬個字符被引入成爲標準之一,該字符被用於馬拉雅拉姆語。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,也是一種前綴碼。它能夠用一至四個字節對Unicode字符集中的全部有效編碼點進行編碼,屬於Unicode標準的一部分,最初由肯·湯普遜和羅布·派克提出。因爲較小值的編碼點通常使用頻率較高,直接使用Unicode編碼效率低下,大量浪費內存空間。UTF-8就是爲了解決向後兼容ASCII碼而設計,Unicode中前128個字符(與ASCII碼一一對應),使用與ASCII碼相同的二進制值的單個字節進行編碼,這使得原來處理ASCII字符的軟件無須或只須作少部分修改,便可繼續使用。所以,它逐漸成爲電子郵件、網頁及其餘存儲或發送文字優先採用的編碼方式。
結構
UTF-8使用一至六個字節爲每一個字符編碼(儘管如此,2003年11月UTF-8被RFC 3629從新規範,只能使用原來Unicode定義的區域,U+0000到U+10FFFF,也就是說最多四個字節):
一、128個US-ASCII字符只需一個字節編碼(Unicode範圍由U+0000至U+007F)。
二、帶有附加符號的拉丁文、希臘文、西裏爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則須要兩個字節編碼(Unicode範圍由U+0080至U+07FF)。
三、其餘基本多文種平面(BMP)中的字符(這包含了大部分經常使用字,如大部分的漢字)使用三個字節編碼(Unicode範圍由U+0800至U+FFFF)。
四、其餘極少使用的Unicode 輔助平面的字符使用四至六字節編碼(Unicode範圍由U+10000至U+1FFFFF使用四字節,Unicode範圍由U+200000至U+3FFFFFF使用五字節,Unicode範圍由U+4000000至U+7FFFFFFF使用六字節)。
對上述說起的第四種字符而言,UTF-8使用四至六個字節來編碼彷佛太耗費資源了。但UTF-8對全部經常使用的字符均可以用三個字節表示,並且它的另外一種選擇,UTF-16編碼,對前述的第四種字符一樣須要四個字節來編碼,因此要決定UTF-8或UTF-16哪一種編碼比較有效率,還要視所使用的字符的分佈範圍而定。不過,若是使用一些傳統的壓縮系統,好比DEFLATE,則這些不一樣編碼系統間的的差別就變得微不足道了。若顧及傳統壓縮算法在壓縮較短文字上的效果不大,能夠考慮使用Unicode標準壓縮格式(SCSU)。
UTF-8編碼字節含義對於UTF-8編碼中的任意字節B,若是B的第一位爲0,則B獨立的表示一個字符(ASCII碼); 若是B的第一位爲1,第二位爲0,則B爲一個多字節字符中的一個字節(非ASCII字符); 若是B的前兩位爲1,第三位爲0,則B爲兩個字節表示的字符中的第一個字節; 若是B的前三位爲1,第四位爲0,則B爲三個字節表示的字符中的第一個字節; 若是B的前四位爲1,第五位爲0,則B爲四個字節表示的字符中的第一個字節;所以,對UTF-8編碼中的任意字節,根據第一位,可判斷是否爲ASCII字符;根據前二位,可判斷該字節是否爲一個字符編碼的第一個字節;根據前四位(若是前兩位均爲1),可肯定該字節爲字符編碼的第一個字節,而且可判斷對應的字符由幾個字節表示;根據前五位(若是前四位爲1),可判斷編碼是否有錯誤或數據傳輸過程當中是否有錯誤。