2012-08-16 26 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