Java編程——編碼問題

編程語言 Java Notepad++ 美國 緣緣科技資訊 2017-06-07

隨著計算機的發展,幾乎每個國家都在使用計算機,然而每個國家都有自己的語言,如何讓各個國家的語言能夠在計算機中使用,這就會涉及到編碼的問題。 在此主要講解一下,ASCII、ISO8859-1、GB2312、GBK、Unicode和UTF-8編碼及之間的關係。

5.1 ASCII

計算機最早出現是在美國,而美國的語言是26個英文字符大小寫、數字、換行空格等,所以他們就用7位的二進制數表示他們所需要的字符,就是2的7次方,也即128個字符,同時最高位恆為0,這就是ASCII編碼,全稱是:American Standard Code for Information Interchange,中文意思是:美國信息互換標準代碼。

5.2 ISO8859-1

隨著計算機使用越來越廣泛,有些國家的語言中的有些字符,在ASCII編碼中找不到,由於ASCII編碼的最高位恆0,即沒有利用起來,所以就將最高位也利用起來,即將編碼擴展到8位,那麼就是2的8次方256個字符了,這就是ISO8859-1編碼。ISO8859-1編碼是兼容ASCII編碼的。

5.3 GB2312和GBK

計算機進入中國後,我們發現常用漢字就會有6000多個,那麼ISO8859-1和ASCII編碼都是遠遠沒法滿足的。當時我們中國就定義了一個標準:小於127的字符與原意義相同(保持與ASCII的兼容性),但是兩個大於127的字符連在一起時,就表示一個漢字。這樣我們就湊出來了7000多個簡體漢字的編碼了。此外,這些編碼還對ASCII碼中已有的標點、數字、字母都用兩字節重新編碼,這就是通常說的“全角”字符。這種編碼就是GB2312。 但是中國的漢字還是有很多,GB2312無法顯示繁體中文,於是我們不得不繼續挖掘GB2312的潛能,乾脆只要求第一個字節大於127而不管後一個字節的大小了。這種擴展之後的編碼方案稱為GBK。

5.4 Unicode

由於各個國家都搞出了一套自己的編碼標準,結果相互之間誰也不懂誰的編碼,互不兼容。此時ISO(國際標誰化組織)為了解決這個問題,搞了一個全球統一的字符集編碼方案,叫UCS(Universal Character Set),俗稱Unicode。Unicode的編碼中規定所有字符都用2個字節,即用16位來表示,能表示的字符數就是2的16次方,即65536個字符,這樣基本上全球所有字符都可以包含了。但是這樣有個問題,就是對於英文字符來說,原來它們用1個字節就可以表示的,現在要用2個字節來表示,這樣就會浪費一半的空間。

5.5 UTF-8

互聯網出現後,為了解決Unicode編碼如何在網絡上傳輸的問題,於是面向傳輸的眾多UTF(UCS Transfer Format)標準出現了,其中UTF-8是在互聯網上使用最廣泛的一種Unicode的實現方式,UTF-8最大的一個特點,就是它是一種變長的編碼方式。 它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度,當字符在ASCII碼的範圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼做為它的一部分,注意的是Unicode一箇中文字符佔2個字節,而UTF-8一箇中文字符佔3個字節。

5.6 最佳實踐

為了避免各種中文亂碼問題,我們編碼時,統一用UTF-8編碼。由於目前我們是使用notepad++來編寫程序,所以需要設置notepad++的編碼方法。當我們編寫程序不是UTF-8編碼時,我們可以利用notepadd++,將其轉換成UTF-8。轉換方法,就是先notepad++打開該文件,然後點擊“編碼”,選擇“UTF-8無BOM編碼格式”,保存即可。

Java編程——編碼問題

注意事項: 當我們用UTF-8編寫程序時,需要用javac命令來編譯程序,由於javac編譯程序時,它會默認選擇操作系統的編碼來編譯程序,中國大陸的電腦默認的操作系統編碼大部分都是GBK,那直接用javac命令編譯時就會出錯,出現中文亂碼的情況,原因很簡單,就是我們用的UTF-8編碼來寫的程序,但是又是用的GBK編碼來編譯的程序,這樣肯定會亂碼。此時需要在編譯的時候,指定編譯的編碼,即:

javac -encoding utf-8 HelloWorld.java

通過-encoding utf-8來指定編譯編碼。

本文鏈接http://www.tongtongxue.com/archives/5794.html

相關推薦

推薦中...