無論在編譯前java文件使用何種編碼,在編譯後成class後,都是用Unicode編碼表示。java
jdk在編譯的時候,若是沒有用-encoding參數指定java源程序的編碼格式, 則javac首先得到操做系統默認採用的編碼格式(xp是GBK)。而後jdk把java源文件從該編碼格式轉化爲java內部默認的unicode格式放入內存中,隨後 javac把轉換後的unicode格式的文件進行編譯成.class類文件,此時.class文件是unicode編碼的,它暫放在內存中。緊接着,jdk將此以unicode編碼的編譯後的class文件保存到操做系統中造成.class文件。最終得到的.class文件是內容以unicode編碼格式保存的類文件,它內部包含源程序中的中文字符串,只不過此時它己經由安裝系統編碼格式轉化爲unicode格式了。mysql
一個英文字母(不分大小寫)佔一個字節。sql
一個字節來講有 8 位;每一位能夠表示兩種狀態,也就是 0 或 1,這樣排列組合下來,一個字節就能夠表示 256(2∧8) 種不一樣的狀態。
但並不足以標識全部國家的字符集,因而有了Unicode。編碼
一個英文佔兩個字節,一箇中文(含繁體)佔兩個字節;中文標點佔兩個字節,英文標點佔兩個字節。
統一都用 Unicode 來表示,那必然須要以佔用字節最多的字符長度爲標準。但用多個字節表示英文會浪費內存,咱們須要一個可變長度的字符編碼規則,當是英文時就用一個字節表示,甚至能夠徹底兼容 ASCII 碼。 因而有了UTF-8。spa
一個英文字符等於一個字節,一箇中文(含繁體)等於三個字節。中文標點佔三個字節,英文標點佔一個字節。 (utf-8的mysql庫 VARCHAR2(32) 能支持32箇中文, length() 是 96。)操作系統
利用兩種規則能夠表示一個字節以及多字節的字符。code
大體規則以下:blog
這樣即可根據字符的長度最大程度的節省存儲空間。內存
固然還有其餘的編碼規則,好比 UTF-16
、UTF-32
,平時用的很少,但本質上都和 UTF-8
同樣,都是 Unicode
的不一樣實現,也是用於表示世界上大部分文字的字符集。utf-8