1. 程式人生 > >Java NIO之Charset類字符編碼對象

Java NIO之Charset類字符編碼對象

編碼器 setname AI oca 每次 需要 virt 自然語言 rap

介紹

java中使用Charset來表示編碼對象
This class defines methods for creating decoders and encoders and for retrieving the various names associated with a charset.   
Instances of this class are immutable.


This class also defines static methods for testing whether a particular charset is supported, 
for locating charset instances by name, and for
constructing a map that contains every charset for which support is available in the current Java virtual machine.

Charset常用靜態方法

public static Charset forName(String charsetName)//通過編碼類型獲得Charset對象
public static SortedMap<String,Charset> availableCharsets()//獲得系統支持的所有編碼方式
public static Charset defaultCharset()//
獲得虛擬機默認的編碼方式 public static boolean isSupported(String charsetName)//判斷是否支持該編碼類型

Charset常用普通方法

public final String name()//獲得Charset對象的編碼類型(String)
public abstract CharsetEncoder newEncoder()//獲得編碼器對象
public abstract CharsetDecoder newDecoder()//獲得解碼器對象
. . . 還有很多方法

Charset應用案列

獲得本機支持的所有編碼方式

public void
testGetAvailableCharsets() { // 獲得本機所有編碼格式 Map<String, Charset> charsets = Charset.availableCharsets(); // 叠代遍歷出編碼方式 for (Entry<String, Charset> entry : charsets.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue().name()); } }

獲得JVM虛擬機默認編碼方式

// 獲得JVM默認編碼方式
Charset charset=Charset.defaultCharset();

使用編碼器和解碼器進行字符編碼和解碼

public void testEncoderAndDecoder() throws Exception{

    //使用Charset進行編碼和解碼
    CharsetEncoder encoder=Charset.forName("GBK").newEncoder();
    CharsetDecoder decoder=Charset.forName("GBK").newDecoder();

    ByteBuffer byteBuffer=encoder.encode(CharBuffer.wrap("中國編碼".toCharArray()));

    CharBuffer charBuffer=decoder.decode(byteBuffer);
    String string=charBuffer.toString();

    System.out.println(string);

}

備註:寫編碼方式時候最好使用全大寫字符比如:UTF-8、GBK。通常情況下大小寫都能識別

備註:java中關於字符編碼問題,通常借助String構造方法或URLEncoder/URLDecoder,或則使用Charset的編碼器和解碼器。

總結

編碼和解碼問題是所有程序員都會面臨的問題,尤其是對於非英語系國家的程序員更是如此。只有理解清楚字符編碼原理才能在今後程序開發過程即使遇到編碼問題也能夠處之泰然。

備註:備註計算機只能識別二進制數字,因此如果想要讓計算機識別出自然語言文字自然就需要存在一張二進制數字和自然語言的映射表。每次編碼和解碼時都要查詢這張映射表。

舉例:

假如使用GBK碼表對"中"字編碼結果是183(十進制表示)
如果你使用UTF-8碼表來解碼的話,查出來的183對應的是"國"字。
結果就是錯的了,所以編碼和解碼對應的碼表一定要相同才能夠解碼正確(除非碼表之間有包含關系,比如UTF-8已經包含了ASCII碼表,那麽解碼就沒問題)

參考

1、https://en.wikipedia.org/wiki/Character_encoding
2、http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
3、http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
4、http://polaris.blog.51cto.com/1146394/377468/

Java NIO之Charset類字符編碼對象