Java 从ByteBuffer获取多语言数据
我正在UDP Java应用程序中接收ByteBuffers 现在,这个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 =
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)也会在遇到®时返回错误的值。