2017-04-27 169 views
1

我正在開發Android應用程序,我需要通過TCP/IP與本地服務器進行通信。我們使用JSON(我使用Jackson的解析器)將消息傳遞給服務器。Android/Java:將UTF-8轉換爲UTF-16

當我ObjectMapper.writeValueAsBytes()使用傑克遜它產生以UTF-8字節?我們的本地服務器是用C#.NET編寫的,並且使用UTF-16 Little Endian編碼。

當字節到達服務器時,它無法解析JSON。當我通過將json字節轉換爲字符串來調試服務器時,我可以看到字符串的某些部分被加密。我懷疑是因爲這個UTF-8到UTF-16的Little Endian問題。

我的問題是,我該如何將這些JSON個字節是UTF-8UTF-16小端之前,我把它傳遞給服務器。

感謝

+0

我會改變服務器。首先,通過網絡的任何事情的默認是網絡再見訂單。網絡字節順序是大端,不小。其次,utf-8是在網絡中傳遞字符串數據的標準。 UTF-16是非常不正常的,並且往往只能用於那些在他們認爲2個字節足以容納世界上任何角色的日子裏創建的舊語言。如果你需要在內部使用utf-16,我會在輸入階段轉換它,並在輸出時轉換回utf-8。 –

+0

將字節打印爲十六進制值而不是文本字符串(然後在此處顯示一個小樣本,尤其是包含用於比較正常對比加擾的字節的加密部分)......可能您的轉換隻是製造非字母字符的混亂。 **對於更快的答案**:製作一個示例JSON(顯示它),然後顯示相同的JSON字節如何查找(加擾等)以獲得建議。我懷疑是UTF-8/16問題,雖然... –

回答

2

喜歡的東西

byte[] utf8bytes = ....... 
byte[] utf16bytes = (new String(utf8bytes, "utf-8")).getBytes("utf-16"); 

未經檢驗。

您可以嘗試使用UTF-16LE和UTF-16BE作爲小端和大端。

+0

編碼工作正常!謝謝。事實證明,這不是編碼問題。加密有問題。感謝您的代碼。它可以幫助我確認問題不在編碼中。謝謝! – Sam