2012-10-16 48 views
1

我所遇到這樣一個Java字符串,其中下列是從字符串轉換爲字節[]爲String

body.equals(new String(body.getBytes())); 

我想這是因爲String構造是通過默認處理的編碼身體字節[]作爲UTF-8,我不是100%確定。我將如何能夠將該字符串存儲在一個字節[]中,並能夠稍後將其轉換回來?我想我需要能夠確定字節[]在哪個編碼中。我該怎麼做?

一些上下文:我需要byte [],這樣我就可以壓縮數據,將其存儲在數據庫中,然後解壓並將未壓縮的byte []返回原始字符串。該字符串最初來自某個下載網頁的庫,我不知道在將它傳遞給我之前,它們在字符串上做了什麼處理。

+0

可能重複[什麼是字符編碼,爲什麼我應該打擾它](http://stackoverflow.com/questions/10611455/what-is-character-encoding-and-why-should-i-bother- with-it) – Raedwald

回答

1

只要確保在兩種方式中使用相同的字符集 - 從字符串數組創建字符串時從字符串創建字節數組。

所以,你的例子是更好,因爲:

body.equals(new String(body.getBytes("utf-8"), "utf-8")); 

這將保證,無論在什麼環境中,字節可以理解的。

你也應該幾乎毫無疑問地使用unicode。如果您選擇單字節編碼(例如ISO代碼頁),您將來可能會後悔,即使現在有單字節編碼可以滿足您的需求。

+0

這應該已經是這樣了,因爲構造函數和'getBytes'的文檔都聲明它們將使用默認字符集,一旦VM啓動並緩存默認字符集,這些字符集就不會更改。 – Dunes

+0

@Dunes,雖然我假設實際的示例代碼行從未出現在實際應用程序的任何位置,但它很簡單,只是簡短的一行顯示了正確的構造函數以及正確調用的getBytes方法。實際上,我希望這兩個電話按時間分開,並且往返於持久店鋪。在這種情況下,在兩個調用中提供字符集並且不依賴於平臺默認情況下更安全(在任何環境/平臺中)。你是絕對正確的,但如果你真的在生產中使用這條準確的線,你永遠不需要這麼做。 – joelittlejohn

1

在不指定編碼的情況下在字節和字符之間進行轉換時,行爲與平臺有關。使用JVM範圍內的默認編碼,取決於您的系統。我不知道如果編碼是ASCII並且你有一些非ASCII字符會發生什麼,但我知道你會得到一個不同的字符串。每次演唱會時都需要指定編碼以避免這種情況。

2

平臺默認字符集用於編碼和解碼。

問題是,charset可能是有限的,例如, US-ASCII。如果字符串中的字符超出該字符集,我們將失去它。

使用涵蓋所有unicode字符的字符集,例如UTF-8,UTF-16。