0

我在 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 DB 中,所有内容都设置为UTF8

如果我在 Windows 中运行应用程序,则会显示像 ® 这样的特殊字符,但不会显示中文。

在添加 VM 参数时 -Dfile.encoding=UTF8显示中文,但像 ® 这样的字符显示为 ?? 等等

请帮忙。

编辑:

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

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

4

2 回答 2

0

String dataString = new String(remainingBytes);是错的。你几乎不应该那样做。您应该找出用于将字节放入 UDP 数据包的编码,并在该行使用相同的编码:

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

编辑:根据您更新的问题,encoding应该是"UTF-8"

于 2012-08-16T12:06:05.580 回答
0

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

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

或者

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

于 2012-08-16T12:04:04.533 回答