淺談Java中的編碼理論
Java是使用Unicode字符集的,意思是在內(nèi)存運行的時候是這樣的。當(dāng)Java源程序被編譯為.class文件的時候,是以UTF-8字符集存儲字符的。比如字符串"漢語"的Unicode字符為:0x49 6C ED 8B。在.class文件中則變成了:0xE6 B1 89 E8 AF AD 0D 0A。實際上如果用以下程序輸出“漢語”二個字的16進(jìn)制字節(jié)序列:
String str = "漢語"; |
會發(fā)現(xiàn),實際輸出的是 0xFE FF 6C 49 8B ED。多出來的0xFE FF,是Unicode字符串的BOM(Byte Order Mark)。但是為什么輸出的順序(0xFE FF 6C 49 8B ED)和文件中的順序不一致(0xFF FE 49 6C ED 8B)?
public byte[] getBytes(Charset charset) 使用指定的字符集將此 String 解碼為字節(jié)序列,并將結(jié)果存儲到一個新的字節(jié)數(shù)組中。如果不指定參數(shù),則使用系統(tǒng)默認(rèn)的字符集,對于簡體中文系統(tǒng)一般為GBK。
看程序:
class EncodingExer |
在這個過程中,由Unicode字符得到字符串“漢語”,然后解碼得到了GBK字節(jié)序列。與String.getBytes()相對應(yīng)的是new String(byte[] bytes,Charset charset),它的作用是用字節(jié)序列生成字符串。如果想由剛才的GBK字節(jié)序列得到原來的字符串“漢語”,我們需要做的是:new String(b) 就可以了。將b按照GBK編碼得到字符串“漢語”,然后轉(zhuǎn)化為Unicode字符。如果是str.getBytes("iso-8859-1"),那么還原的時候就是new String(b,"iso-8859-1")??傊褪怯檬裁捶绞骄幋a,就用什么方式解碼。
【編輯推薦】