2015-12-27 116 views
2

我已將具有外部字符的字符串 - 晝夜轉換爲字節數組。 字節數組可以存儲-128到127之間的值,所以對應的值已經被存儲爲3個字節---> -26,-103,-99。字符串Bytearray

這裏的轉換代碼:

String str = "晝"; 
byte[] b = str.getBytes(); 

for(byte bt : b) 
    System.out.println(bt); 

String str1 = new String(b); 
System.out.println(str1); 

能否請你澄清這3個字節是如何被計算爲外來字符

+1

你是如何轉換你的字符串的? [這](https://docs.oracle.com/javase/tutorial/i18n/text/string.html)將幫助 – SMA

+0

{String str =「晝」; byte [] b = str.getBytes(); for(byte bt:b)System.out.println(bt); String str1 = new String(b); System.out.println(str1);} – Senthil

+0

[UTF-8「可變寬度編碼」如何工作?](http://stackoverflow.com/questions/1543613/how-does-utf-8-可變寬度編碼工作) – Joe

回答

3

晝是U + 665D。它看起來像轉換它時,將其轉換爲UTF-8。 UTF-8是Unicode字符的可變長度編碼。 [U + 0800,U + FFFF]中的字符被轉換爲3個字節。

根據this converter,U + 665D是UTF-8中的E6 99 9D(十六進制,230 153 157,十進制,需要一點)。因爲一個字節是-128到127,所以大於127的值顯示爲少於256的數字,所以字節,230 153 157是230-256 153-256 157-256或-26 -103 -99,這是什麼你看到了。

+0

感謝您澄清 – Senthil

1

從字符到字節的所有轉換都使用一些字符集來完成編碼。

你不會說,但我假設你使用String.getBytes()進行了轉換。這只是String.getBytes(Charset.defaultCharset())的快捷方式,默認的Charset取決於您的特定Java環境。您報告的三個值(十六進制)爲0xE6 0x99 0x9D。這是U + 665D(Unicode漢字'白天,日光')的UTF-8編碼。由於這是您開始使用的角色,因此您的環境的默認字符集可能是UTF-8(這不是一個驚喜,但不是您可以指望的任何地方)。

+0

感謝您澄清 – Senthil

+0

這裏是我使用的代碼{String str =「晝」; \t \t byte [] b = str.getBytes(); \t \t \t爲(字節BT:B) \t \t \t \t的System.out.println(BT); \t \t \t String str1 = new String(b); \t \t \t System.out.println(str1);}我沒有在代碼中指定編碼。 Eclipse顯示默認的cp1252編碼。我正在執行Widows服務器的代碼。 UTF-8從哪裏被拿起...你能幫助理解嗎? – Senthil

+0

@Senthil - 這幾乎是我以爲你在做什麼。它爲你的環境使用了默認的字符集,這很可能是UTF-8(或者至少對於那個特定的字符與UTF-8一致)。你可以使用'System.out.println(Charset.defaultCharset()。toString());' –

相關問題