2015-10-15 86 views
1

我需要將java字符串編碼爲UCS,如'h'至'0068'將字符串編碼到UCS2

例如。我有一個測試設置

@Test 
public void testEncodeAsUCS2_string1() throws Exception { 
    String encoded = sendRequestTransformer.encodeAsUCS2("hello"); 
    Assert.assertEquals("00680065006C006C006F", encoded); 
} 

所以這個測試讓我知道,如果轉換成功,例如。你好應該返回00680065006C006C006F

在我的代碼中,我知道下面的轉換是錯誤的,因爲它打印[B @ 742cb491。 (Object類的這個toString方法返回一個字符串,該字符串由對象爲實例的類的名稱,符號字符「@」和對象的哈希代碼的無符號十六進制表示形式組成)

我需要幫助轉換

String encodeAsUcx2(String messageContent){ 

          try { 
              messageContent.getBytes("UTF-16LE"); 
          } catch (UnsupportedEncodingException e) { 
              e.printStackTrace(); 
          } 
          return String.valueOf(messageContent.getBytes()); 

      } 

我該如何解決這個問題?

回答

1

將您的消息轉換爲byte[]之後,您只需循環並將每個byte轉換爲十六進制表示形式,然後按照步驟構建新的String

舉例來說,你可以做這樣的事情:

static String encodeAsUcs2(String messageContent) throws UnsupportedEncodingException { 
    byte[] bytes = messageContent.getBytes("UTF-16LE"); 

    StringBuilder sb = new StringBuilder(); 
    for (byte b : bytes) { 
     sb.append(String.format("%02X", b)); 
    } 

    return sb.toString(); 
} 

我要指出,然而,編碼"hello"何時會返回"680065006C006C006F00",不"00680065006C006C006F"

要獲得您期望的輸出,您需要使用big-endian編碼("UTF-16BE")。

+0

謝謝,適用於正常的英語單詞,但我有不同的語言在不同的語言中的問題。它導致字母輸出爲FFFD,用於指示系統何時無法將數據流呈現給corect符號 – user3520080

+0

@ user3520080您可以舉個例子嗎?您可能試圖對UTF-16不支持的某些內容進行編碼,並且需要使用[Java其他編碼支持]之一(https://docs.oracle.com/javase/8/docs/technotes/)而不是使用指南/ intl/encoding.doc.html)。 – azurefrog