2013-02-07 91 views
3

我只是在從文件中讀取一些數據作爲字節流的過程中,我剛剛遇到一些unicode字符串,我不知道如何處理。Java unicode字節解析

每個字符都使用兩個字節,僅在第一個似乎到包含實際數據,因此,例如字符串「信任」被存儲在文件中:

0x74 0x00(t) 0x72 0x00(r) ...and so on 

一般情況下我只用一個正則表達式用零代替零,因此刪除空白。但是,文件內的單詞之間的空格是通過使用0x00 0x00來實現的,所以試圖做一個簡單的String'replaceAll'就會讓它變得有點麻煩。

我已經嘗試過使用字符串編碼集,比如'ISO-8859-1'和'UTF-8/16',但每次我都要用空格結束。

我沒有創建一個簡單的正則表達式來去除雙零個十六進制值,這就是:

new String(bytes).replaceAll("[\\00]{2,},""); 

但這顯然只適用於雙零,我真的很想來取代單一的零一無所有,以及具有實際的ASCII/Unicode空格字符的雙零。

我可以發誓,其中一個Java字符串格式設置處理這種事情,但我可能是錯的。那麼我是否應該創建一個正則表達式來去除零,或者Java是否提供了實現它的機制?

謝謝

回答

6

那就是"UTF-16LE"0x00 0x00實際上是以UTF-16編碼NUL字符,所以這就是你會得到的。

該編碼可以編碼大約一百萬個不同的字符,每個字符使用2或4個字節。前256個字符用第二個字節0x00編碼,如果文本只包含那些可能被視爲無用的字符,但是其他字符需要。例如,歐元貨幣符號將顯示爲0xAC 0x20

+0

啊,是的,就是這樣,我無法找到這個。這回答了我的問題並修復了它。非常感謝您的快速回復,我會盡快點擊接受。感謝Esailija! – Tony

3

我只是在從文件中讀取一些數據作爲字節流的過程中,我剛剛遇到一些unicode字符串,我不知道如何處理。

它們轉換爲使用適當的字符集的字符串,在這種情況下UTF-16LE(little-endian的UTF-16,與低位字節第一其次高位字節)

String str = new String(bytes, "UTF-16LE"); 
+0

謝謝伊恩,那正是我所做的。出於興趣,識別正在使用的unicode字符集類型的最佳方式是什麼? – Tony

+2

@Tony通常的編碼沒有被識別,但明確告訴。就像如果您從http服務器獲取文件一樣,服務器可能會向您發送包含編碼的http標頭。沒有這些信息,自動檢測編碼是不可靠的。手動可以做一個最好的猜測,看看文本是否正確。 HTTP://en.wikipedia。org/wiki/Charset_detection – Esailija

+2

@Tony除非數據以字節順序標記開頭 - 如果前兩個字節是FE FF,那麼它是big-endian UTF-16,FF FE則不是真正的「最佳方式」 - 印度的UTF-16,EF BB BF的UTF-8。但是,如果你正在閱讀二進制格式,那麼格式規範應該告訴你什麼編碼(包括字節順序)的期望。 –