2015-10-15 83 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