2015-05-02 39 views
4

強制的Unicode我最近發現,你將字符串轉換爲以下方式的字節數組:現在在字節變量

String S = "ab"; 
byte arr[] = S.getBytes(); 

,我試着用字符串"\u9999"和答案是[63]。我認爲這將是9999(mod 128)= 15,這實際上是我們得到的結果byte b = 9999。 63背後的原因是什麼?

+1

當你說「答案是[63]」時,你是什麼意思?什麼樣的答案? – StilesCrisis

+0

我的意思是'arr [] = {63}' – Faustus

回答

5

對於Unicode字符,你可以指定在呼叫中的編碼getBytes

byte arr[] = S.getBytes("UTF8"); 

至於爲什麼你得到63結果,調用getBytes沒有一個參數使用平臺的默認編碼。字符\u9999無法在您的默認編碼中正確表示,因此會變成?,其中ASCII爲十進制值63

+1

絕對正確。另請參見:[爲什麼new String(bytes,enc).getBytes(enc)不返回原始字節數組?](http://stackoverflow.com/questions/2544965/why-new-stringbytes-enc-getbytesenc-does - 未返回最原始的字節數組) – FoggyDay

1

這是關於默認字符集。它可能與你的java文件的編碼有關。

(在我的機器,當我編譯Java文件,CP1252的編碼,getBytes()似乎還使用CP1252作爲默認的字符集。由於CP1252不支持Unicode字符,就變成了?字符,即63。當我編譯Java使用UTF-16,getBytes()返回數據0x9999如預期的編碼。)

這種方法時此字符串不能在 默認字符集進行編碼的行爲是未指定的。 (來源:getBytes() from oracle.com

我的建議是簡單地使用"\u9999".getBytes(StandardCharsets.UTF_16LE)(或UTF_16BE),以獲得您想要的2字節數組。所以沒有必要關心java源碼的編碼。該陣列應該是{-103,-103}

byte的值爲-103在內存中表示爲0x99