2012-08-16 40 views
0

我正在接收UDP Java應用程序中的ByteBuffers。從ByteBuffer獲取多種語言的數據

現在這個ByteBuffer中的數據可以是任何語言的任何字符串,或者是由分開的任何特殊字符。

我使用以下代碼從它獲取字符串。

public String getString() { 
byte[] remainingBytes = new byte[this.byteBuffer.remaining()]; 
this.byteBuffer.slice().get(remainingBytes); 
String dataString = new String(remainingBytes); 
int stringEnd = dataString.indexOf(0); 

if(stringEnd == -1) { 
    return null; 
} else { 
    dataString = dataString.substring(0, stringEnd); 
    this.byteBuffer.position(this.byteBuffer.position() + dataString.getBytes().length + 1); 

    return dataString; 
} 
} 

這些字符串存儲在MySQL數據庫的一切設置爲UTF8

如果我在Windows中運行應用程序,那麼顯示特殊字符如®,但中文不是。

添加VM參數-Dfile.encoding = UTF8 chinese會顯示,但字符如®顯示爲?等等。

請幫忙。

編輯:

在UDP分組輸入字符串是可變長度字節的字段,編碼UTF-8,由0×00

對於JDBC終止也我使用了useUnicode =真&的characterEncoding = UTF -8

回答

1

String dataString = new String(remainingBytes);是錯誤的。你應該幾乎從不這樣做。你應該找出編碼使用的是什麼把字節到UDP數據包,並使用相同的編碼在該行:

String dataString = new String(remainingBytes, encoding); // e.g. "UTF-8" 

編輯:基於您的更新問題,encoding"UTF-8"

+0

即使使用-Dfile.encoding = UTF8作爲VM參數,它是否也需要? – User1234 2012-08-16 12:08:38

+0

是的。不要使用這個VM參數,它與使用**新字符串(remainingBytes,「UTF-8」); **和** dataString.getBytes(「UTF-8」)**中文字符顯示正確無關 – artbristol 2012-08-16 12:12:46

+0

。 但是®不顯示! – User1234 2012-08-16 12:38:14

0

不確定,但dataString只包含數據直到這個零,因爲stringEnd在第一個零位置顯示,但不在後面。

dataString = dataString.substring(0,stringEnd + 1);

炭specChar = dataString.substring(stringEnd,stringEnd + 1);它應該只返回特殊字符,但正如我在大開方面所說的,不知道...

+0

它的工作原理完美的英文資料。我多次調用getString()來獲取更多數據。 – User1234 2012-08-16 12:06:49