2013-09-25 58 views
0

我有一個十六進制字符串(sA)從UTF8字符串轉換。 當我將十六進制字符串sA轉換爲UTF8字符串時,我無法使用構建模式(運行文件.jar)在表單UI中顯示它,但是當我以運行模式或調試模式運行時,UTF8字符串可以在窗體UI中顯示。 我使用netbeans IDE 7.3.1。 我的代碼如下:在java中顯示UTF8字符串與構建模式時出現錯誤

public String hexToString(String txtInHex) { 
    byte[] txtInByte = new byte[txtInHex.length()/2]; 
    int j = 0; 
    for (int i = 0; i < txtInHex.length(); i += 2) { 
     txtInByte[j++] = Byte.parseByte(txtInHex.substring(i, i + 2), 16); 
    } 
    return new String(txtInByte); 
} 

private String asHex(byte[] buf) { 
    char[] chars = new char[2 * buf.length]; 
    for (int i = 0; i < buf.length; ++i) { 
     chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4]; 
     chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F]; 
    } 
    return new String(chars); 
} 

回答

0
new String(txtInByte, "UTF-8"); 

沒有編碼採取平臺編碼,例如Windows-1252。同樣的反過來:String.getBytes-

String s = "...."; 
byte[] b = s.getBytes("UTF-8"); 
1

該代碼有多個問題。

字節值的有效範圍是-128到127,或者-807F(十六進制),而Byte.parseByte強制執行此操作。如果您的asHex方法必須處理第二個字節大於127的字符,它將生成一個字符串,該字符串不能被toHexString解碼。

asHex方法只處理輸入字符的第二個字節,所以它只能對前256個Unicode字符正確工作,併爲其餘的字符輸出僞造輸出。

toHexString方法從字節數組中解碼出一個字符串,並假定某些特定於平臺的默認編碼,如果數據被認爲是以UTF-8編碼並且默認編碼是別的,那麼這將導致錯誤的結果。

爲什麼你想創建自己的方法來編碼和解碼十六進制字符串,而不是使用衆所周知的和經過測試的庫?

相關問題