強制的Unicode我最近發現,你將字符串轉換爲以下方式的字節數組:現在在字節變量
String S = "ab";
byte arr[] = S.getBytes();
,我試着用字符串"\u9999"
和答案是[63]
。我認爲這將是9999(mod 128)= 15,這實際上是我們得到的結果byte b = 9999
。 63背後的原因是什麼?
強制的Unicode我最近發現,你將字符串轉換爲以下方式的字節數組:現在在字節變量
String S = "ab";
byte arr[] = S.getBytes();
,我試着用字符串"\u9999"
和答案是[63]
。我認爲這將是9999(mod 128)= 15,這實際上是我們得到的結果byte b = 9999
。 63背後的原因是什麼?
對於Unicode字符,你可以指定在呼叫中的編碼getBytes
:
byte arr[] = S.getBytes("UTF8");
至於爲什麼你得到63
結果,調用getBytes
沒有一個參數使用平臺的默認編碼。字符\u9999
無法在您的默認編碼中正確表示,因此會變成?
,其中ASCII爲十進制值63
。
絕對正確。另請參見:[爲什麼new String(bytes,enc).getBytes(enc)不返回原始字節數組?](http://stackoverflow.com/questions/2544965/why-new-stringbytes-enc-getbytesenc-does - 未返回最原始的字節數組) – FoggyDay
這是關於默認字符集。它可能與你的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
。
當你說「答案是[63]」時,你是什麼意思?什麼樣的答案? – StilesCrisis
我的意思是'arr [] = {63}' – Faustus