Guide to Character Encoding
該文章主要討論編碼基礎(chǔ)以及在Java中如何處理壹哺。
重要概念
1垢啼、編碼:字符對應(yīng)二進制的映射集合。例如“T”在US-ASCII對應(yīng)“01010100”张肾。
2芭析、字符集:一系列映射關(guān)系的字符。例如ASCII有128字符吞瞪。
3馁启、代碼點:一個對應(yīng)特指字符的整數(shù)∩指眩“T“在Unicode對應(yīng)“U+0054”(它提供了一種將十六進制數(shù)字標(biāo)記為Unicode代碼點惯疙。“U”表示“Unicode”) (或 在十進制是84)妖啥。
編碼類型
單字節(jié)編碼
最著名就是ASCII霉颠,通過七位二進制數(shù)字來表示字符,一共有128個字符荆虱。
ASCII沒有充分使用每一個字節(jié)蒿偎,所有就一些擴展編碼類型。例如ISO-8859-1怀读,額外包含128格字符個
雙字節(jié)編碼
BIG5和SHIFT-JIS使用雙字節(jié)方式诉位,可以表示更加廣的字符。包含一部分字符菜枷。
Unicode
Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的苍糠,它為每種語言中的每個字符設(shè)定了統(tǒng)一并且唯一的二進制碼,以滿足跨語言啤誊、跨平臺進行文本轉(zhuǎn)換岳瞭、處理的要求。
UTF-32
使用四個字節(jié)來表示字符坷衍,但是會出現(xiàn)很多浪費寝优。例如"T"對應(yīng)"00000000 00000000 00000000 01010100"
UTF-8
通過不同字節(jié)長度來表示不同字符。
"T"對應(yīng)"01010100"
"語"對應(yīng)"11101000 10101010 10011110"
Java對編碼使用
Java支持需要編碼格式枫耳,包括它們之間轉(zhuǎn)化乏矾。包含US-ASCII, ISO-8859-1, UTF-8, UTF-16。也可以支持其他編碼格式迁杨。
默認編碼格式
JVM在啟動時候決定默認編碼格式钻心,一般依賴運行系統(tǒng)的編碼格式
通過Charset.defaultCharset().displayName();打印出來。
MacOS:UTF-8
Windows:windows-1252
JVM使用默認編碼
InputStreamReader和Fileheader
OutputStreamWriter和FileWriter
Formatter和Scanner
URLEncoder和URLDecoder
如何修改默認編碼
file.encoding和sun.jnu.encoding
運行啟動參數(shù)
-Dfile.encoding="UTF-8"
-Dsun.jnu.encoding="UTF-8"