下面代碼會直接輸出亂碼。緣由是:getBytes
須要指定字符編碼java
ByteBuffer byteBuffer = ByteBuffer.wrap("開源中國".getBytes()); CharBuffer buffer = byteBuffer.asCharBuffer(); System.out.println(buffer.toString());
修改後就能符合預期:數組
ByteBuffer byteBuffer = ByteBuffer.wrap("開源中國".getBytes(StandardCharsets.UTF_16)); CharBuffer buffer = byteBuffer.asCharBuffer(); System.out.println(buffer.toString());
字符編碼和編碼的方式不一致致使的。編碼
getBytes 其實就是把字符串編碼按照默認的UTF-8進行編碼稱爲字節數組(看源碼可知).code
byteBuffer.asCharBuffer()也就是轉爲UTF-8的CharBuffer。JAVA內部使用的是UTF-16字符串
下面會證實:get
ByteBuffer byteBuffer = ByteBuffer.wrap("開源中國".getBytes()); System.out.println(byteBuffer.limit()); // 12 每一個字符3字節 // 把 ByteBuffer 使用UTF-8解碼爲UTF-16的CharBuffer而後toString輸出 System.out.println(StandardCharsets.UTF_8.decode(byteBuffer).toString()); // 結果能正常輸出 byteBuffer.rewind(); CharBuffer buffer = byteBuffer.asCharBuffer(); System.out.println(buffer.toString());
JAVA要輸出CharBuffer或者char數組,會直接認爲是UTF-16編碼來獲取對應的代碼點,最終找到映射的字符源碼
String.getBytes:使用默認編碼UTF-8(Windows會不同)進行編碼爲對應字節it