ByteBuffer.asCharBuffer打印字符串亂碼

背景

下面代碼會直接輸出亂碼。緣由是: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());

緣由

字符編碼和編碼的方式不一致致使的。編碼

  1. getBytes 其實就是把字符串編碼按照默認的UTF-8進行編碼稱爲字節數組(看源碼可知).code

  2. 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());

小結

  1. JAVA要輸出CharBuffer或者char數組,會直接認爲是UTF-16編碼來獲取對應的代碼點,最終找到映射的字符源碼

  2. String.getBytes:使用默認編碼UTF-8(Windows會不同)進行編碼爲對應字節it

相關文章
相關標籤/搜索