Java 从ByteBuffer获取多语言数据

Java 从ByteBuffer获取多语言数据,java,utf-8,character-encoding,udp,Java,Utf 8,Character Encoding,Udp,我正在UDP Java应用程序中接收ByteBuffers 现在,这个ByteBuffer中的数据可以是任何语言的任何字符串,也可以是由零分隔的任何特殊字符 我使用以下代码从中获取字符串 public String getString() { byte[] remainingBytes = new byte[this.byteBuffer.remaining()]; this.byteBuffer.slice().get(remainingBytes); String dataString =

我正在UDP Java应用程序中接收ByteBuffers

现在,这个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将显示中文,但像®这样的字符显示为??等等

请帮忙

编辑:

UDP数据包中的输入字符串是可变长度字节字段,以UTF-8编码,以0x00结尾


对于JDBC,我也使用Unicode=true&characterEncoding=UTF-8

不确定,但dataString只包含到这个零位的数据,因为stringEnd显示在第一个零位上,而不是后面

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


char specChar=dataString.substring(stringEnd,stringEnd+1);它应该只返回特殊字符,但正如我在biggining中所说的,不确定…

stringdatastring=newstring(remainingBytes)是错误的。你几乎不应该那样做。您应该了解将字节放入UDP数据包时使用的编码,并在该行使用相同的编码:

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

编辑:根据您更新的问题,
编码
应该是
“UTF-8”

它非常适合英文数据。我多次调用getString()以获取更多数据。即使使用-Dfile.encoding=UTF8作为VM参数,也有必要这样做吗?是的。不要使用VM参数,它与使用新字符串(remainingBytes,“UTF-8”)无关;正确显示dataString.getBytes(“UTF-8”)中文字符。但是®不显示!!这个错误的显示器在哪里?您必须从端到端获得正确的编码,因此JDBC代码或显示输出中仍然可能存在错误。尝试阅读我不认为JDBC代码中有错误,因为数据在遇到®时也会变得混乱。我通过打印到控制台来检查。而dataString.indexOf(0)也会在遇到®时返回错误的值。