Java常用字符集編碼詳解
Java常用字符集編碼詳解
Web開發(fā)的時候經(jīng)常會遇到一些字符編碼的錯誤,如頁面亂碼等問題,所以有必要需對字符編碼有所了解,以下是Ricki收集的一些資料(可能不是很全,但希望對你有所幫助)
Java標(biāo)準(zhǔn)字符集:所謂Java標(biāo)準(zhǔn)字符集,就是Java平臺支持的字符集:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16。
US-ASCII
US-ASCII,這是一個出現(xiàn)得比較早的字符編碼規(guī)范;因為它出現(xiàn)比較早,在通用型方面也考慮得比較少,所以也比較簡單。一個ASCII字符用一個字節(jié)存儲,也就是說它可以用來表示256個不同的字符。由于英文大小寫字母、阿拉伯?dāng)?shù)字和標(biāo)點符號等字符是有限的,所以就把前128個字符作為常用字符,而剩下的高位字符作為擴展字符。這128個字符通常用來表示音標(biāo)、特殊字符等。
ISO-8859-1
ISO-8859-1也常被稱為Latin_1(拉丁1)字符集,像MySQL的默認字符集就是ISO-8859-1,其他它與ASCII編碼類似,也是用一個字節(jié)表示一個字符,也只用于表示英文字符、數(shù)字、符號及特殊字符。它與ASCII唯一的不同在于它是一個國際標(biāo)準(zhǔn),而ASCII只是一個美國國家標(biāo)準(zhǔn)。
中文字符集
通過對上面兩種字符集的了解,如果想用它們來表示中文字符集,顯然有些不太現(xiàn)實,因為常用的中文字符都有上千個之多,所以我們需要能表示更多字符的字符集實現(xiàn)中文字符編碼。但又為了兼容ASCII編碼,中國在ASCII的基礎(chǔ)上制定了自己的字符編碼規(guī)范,也就是我們比較熟悉的GB2312,它的全稱是GB2312-80信息交換用漢字編碼字符集(基礎(chǔ)集)。它能定義了7000多個常用漢字和符號,GB2312的實現(xiàn)是通過使用兩個擴展ASCII字符來定義一個中文字符,根據(jù)這一特定,我們就可以判斷相鄰的兩個ASCII字符是否為擴展字符,我們就可以確認這兩個字符組成一個中文字符,但是在擴展ASCII字符中,也定義了一些其他字符,所以相鄰兩個ASCII同為擴展字符時,并不能肯定的說它是一個中文字符,處理起來是相當(dāng)麻煩的。
除了GB2312這個字符集以外,還有幾個中文的字符集:Big5、HKSCS、GBK、GB18030。
——> Big5:臺灣使用的編碼標(biāo)準(zhǔn),繁體中文字符,字符數(shù)也有7000多個。
——> HKSCS:香港使用的編碼標(biāo)準(zhǔn),繁體中文字符,但跟Big5不同
——> GBK:《漢字內(nèi)碼擴展規(guī)范》是GB2312的擴展集,不僅增加了大量簡體中文字符和符號,也增加了對繁體中文字符的支持,另外還留有用戶自定義字符空間,總共字符數(shù)在22000左右。
——> GB18030:《信息交換用漢字編碼字符集 基本集的擴充》將會成為中國字符編碼規(guī)范新標(biāo)準(zhǔn),它兼容GB2312和GBK。
GB2312、Big5、HKSCS是同一時期的產(chǎn)物,雖然都是通過擴展ASCII來實現(xiàn)的,但是它們彼此之間并不兼容,GBK作為GB2312的擴展產(chǎn)物,它幾乎涵蓋了Big5里所有的繁體字,并將一些不常見的中文字符也添加進入標(biāo)準(zhǔn),windows操作系統(tǒng)支持的中文字符集也就是GBK;GB18030是2000年制定的標(biāo)準(zhǔn),它為了兼容GB2312和GBK,保留了雙字節(jié)編碼,同時為了擴展,新增了四字節(jié)編碼,擴展后的GB18030字符集新增了部分少數(shù)民族文字,支持的字符數(shù)量比GBK多5000多個。
Unicode
通過對上面知識的學(xué)習(xí),你就會覺得Unicode(Universal Multiple-Octet Coded Character Set)的出現(xiàn)是種必然,如果沒有一套統(tǒng)一的字符編碼標(biāo)準(zhǔn),我們將舉步維艱。Unicode提供了兩套字符編碼標(biāo)準(zhǔn):
——> UCS-2(Unicode-16):2個字節(jié)字符編碼
——> UCS-4(Unicode-32):4個字節(jié)字符編碼
Unicode編碼能支持的字符數(shù)相當(dāng)多,Unicode-16就能定義65535個字符,其中包含了大量中文字符(一個中文字符只暫一位)。
其實Unicode是一種理想化的字符標(biāo)準(zhǔn),它并沒有過多的考慮目前已經(jīng)存在的字符集標(biāo)準(zhǔn),它只與ISO-8859-1兼容,但它并不與ASCII兼容,想從ASCII編碼轉(zhuǎn)換為Unicode編碼相當(dāng)困難;另外,Unicode里很多字符都有‘0’字節(jié),這將導(dǎo)致C語言會誤認為它為字符串結(jié)束標(biāo)志,這是相當(dāng)可怕的,如果使用了Unicode編碼,所有用C語言實現(xiàn)的系統(tǒng)將無法正常工作。這也是為何會出現(xiàn)UTF的原因。
UTF編碼
UTF(UCS Transformation Format)實現(xiàn)了Unicode與計算機所使用的編碼之間的映射關(guān)系。常用的UTF編碼有:UTF-8、UTF-16、UTF-7等。
——> UTF-8:是三字節(jié)變長字符編碼,它能兼容ASCII編碼。
——> UTF-16:是Unicode的標(biāo)準(zhǔn)實現(xiàn),與Unicode編碼規(guī)范相同
——> UTF-16BE:UTF-16編碼big endian,先存放高字節(jié)
——> UTF-16LE:UTF-16編碼little endian,先存放低字節(jié)
其中,big endian和little endian是CPU處理多字節(jié)字符的不同方法,因CPU的不同而有所不同。另外,很多人都認為UTF-8和Unicode是一個概念,其實UTF-8只是Unicode標(biāo)準(zhǔn)的一種編碼實現(xiàn),是目前使用得比較多的字符編碼格式之一。
PS:一、 各個國家和地區(qū)所制定的不同 ANSI 編碼(不同的國家和地區(qū)制定了不同的標(biāo)準(zhǔn),由此產(chǎn)生了 GB2312, BIG5, JIS 等各自的編碼標(biāo)準(zhǔn)。這些使用 2 個字節(jié)來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼)標(biāo)準(zhǔn)中,都只規(guī)定了各自語言所需的“字符”。比如:漢字標(biāo)準(zhǔn)(GB2312)中沒有規(guī)定韓國語字符怎樣存儲。這些 ANSI 編碼標(biāo)準(zhǔn)所規(guī)定的內(nèi)容包含兩層含義:
1.使用哪些字符。也就是說哪些漢字,字母和符號會被收入標(biāo)準(zhǔn)中。所包含“字符”的集合就叫做“字符集”。
2.規(guī)定每個“字符”分別用一個字節(jié)還是多個字節(jié)存儲,用哪些字節(jié)來存儲,這個規(guī)定就叫做“編碼”。
各個國家和地區(qū)在制定編碼標(biāo)準(zhǔn)的時候,“字符的集合”和“編碼”一般都是同時制定的。因此,平常我們所說的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”這層含義外,同時也包含了“編碼”的含義。
“UNICODE 字符集”包含了各種語言中使用到的所有“字符”。用來給 UNICODE 字符集編碼的標(biāo)準(zhǔn)有很多種,比如:UTF-8, UTF-16, UnicodeLittle, UnicodeBig 等。
二、從計算機對多國語言的支持角度看,大致可以分為三個階段:
系統(tǒng)內(nèi)碼 說明 系統(tǒng)
階段一 ASCII 計算機剛開始只支持英語,其它語言不能夠在計算機上存儲和顯示。 英文 DOS
階段二 ANSI編碼
(本地化) 為使計算機支持更多語言,通常使用 0x80~0xFF 范圍的 2 個字節(jié)來表示 1 個字符。比如:漢字 '中' 在中文操作系統(tǒng)中,使用 [0xD6,0xD0] 這兩個字節(jié)存儲。
不同的國家和地區(qū)制定了不同的標(biāo)準(zhǔn),由此產(chǎn)生了 GB2312, BIG5, JIS 等各自的編碼標(biāo)準(zhǔn)。這些使用 2 個字節(jié)來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文系統(tǒng)下,ANSI 編碼代表 GB2312 編碼,在日文操作系統(tǒng)下,ANSI 編碼代表 JIS 編碼。
不同 ANSI 編碼之間互不兼容,當(dāng)信息在國際間交流時,無法將屬于兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。 中文 DOS,中文 Windows 95/98,日文 Windows 95/98
階段三 UNICODE
(國際化) 為了使國際間信息交流更加方便,國際組織制定了 UNICODE 字符集,為各種語言中的每一個字符設(shè)定了統(tǒng)一并且唯一的數(shù)字編號,以滿足跨語言、跨平臺進行文本轉(zhuǎn)換、處理的要求。

浙公網(wǎng)安備 33010602011771號