一、什麼是字符串
在Java中,String可定義爲特定編碼(utf-16)的字符數組。
也就是說代碼運行起來,String實例內的字符數組都爲utf16編碼。
代碼自身的編碼類型由本地代碼文件的字符編碼類型確定。
本文僅討論在Java語言中的String,全文的String僅代表Java中的String類。
二、什麼是編碼轉換
-
由某種編碼的字節數組轉換爲utf16編碼的字符數組
-
由utf16編碼的字節數組轉換爲某種編碼的字節數組
下面給出具體代碼的解釋:
-
String.getBytes(String charsetName); 將utf16編碼的字節數組轉爲指定編碼的字節數組
// 運行時【中文】從代碼裏以某種編碼轉成utf16,該編碼爲代碼文件編碼
String utf_16_String = "中文";
byte[] gbkBytes = utf_16String.getBytes("gbk");
-
new String(byte[] bytes, String charsetName); 以指定編碼轉換字符數組到utf16編碼
// 構造方法中指定字符數組的編碼,根據碼點轉成utf16編碼的字符數組
String utf_16_String = new String(gbkBytes,"gbk");
註釋裏提到了碼點,意思爲從A編碼到B編碼的橋樑,如gbk中的字節【ba c3】對應到uft16應爲什麼字節
字節數組在不同編碼間的轉換依靠這樣一張紙表,當然也不是絕對的,有些編碼之間可以通過截取完成轉換
三、爲何出現亂碼
根本原因,使用錯誤的編碼讀取字符數組
以讀文件爲例,已知String爲utf16編碼,讀出來的內容出現亂碼
問題出在以特定編碼轉成utf16時,這個指定的特定編碼和文件編碼不一致,丟失原文的本意
打個不恰當的比喻,把文件的字符數組比作一段英文,想知道這段英文的意思
把英文丟到翻譯軟件裏,讓它用日轉中,這轉出來的結果肯定不是想要的(當然谷歌現在很人性,有防呆處理)
四、總結
在日常使用String時,可能會因爲忽略掉utf16,對String從哪來、到哪去產生疑惑
在通信中文件被轉換爲流傳輸,這就導致兩端可能因爲編碼指定錯誤而出現亂碼
想要更詳細的瞭解可以從這篇看起,連着有三篇
參考: