[Java]關於字符串及編碼

一、什麼是字符串

在Java中,String可定義爲特定編碼(utf-16)的字符數組。

也就是說代碼運行起來,String實例內的字符數組都爲utf16編碼。

代碼自身的編碼類型由本地代碼文件的字符編碼類型確定。

本文僅討論在Java語言中的String,全文的String僅代表Java中的String類

二、什麼是編碼轉換

  1. 由某種編碼的字節數組轉換爲utf16編碼的字符數組

  2. 由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應爲什麼字節

image

字節數組在不同編碼間的轉換依靠這樣一張紙表,當然也不是絕對的,有些編碼之間可以通過截取完成轉換

三、爲何出現亂碼

根本原因,使用錯誤的編碼讀取字符數組

以讀文件爲例,已知String爲utf16編碼,讀出來的內容出現亂碼

問題出在以特定編碼轉成utf16時,這個指定的特定編碼和文件編碼不一致,丟失原文的本意

打個不恰當的比喻,把文件的字符數組比作一段英文,想知道這段英文的意思

把英文丟到翻譯軟件裏,讓它用日轉中,這轉出來的結果肯定不是想要的(當然谷歌現在很人性,有防呆處理)

四、總結

在日常使用String時,可能會因爲忽略掉utf16,對String從哪來、到哪去產生疑惑

在通信中文件被轉換爲流傳輸,這就導致兩端可能因爲編碼指定錯誤而出現亂碼

想要更詳細的瞭解可以從這篇看起,連着有三篇

 

參考:

文本在內存中的編碼(2)——亂碼探源(5)——國棟

字符串和編碼——timetellu

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章