【问题标题】:Get Multilingual Data from ByteBuffer从 ByteBuffer 获取多语言数据
【发布时间】:2012-08-12 17:58:13
【问题描述】:

我在 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,我也使用 useUnicode=true&characterEncoding=UTF-8

【问题讨论】:

    标签: java utf-8 character-encoding udp


    【解决方案1】:

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

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

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

    【讨论】:

    • 它非常适用于英文数据。我多次调用 getString() 以获取更多数据。
    【解决方案2】:

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

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

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

    【讨论】:

    • 即使使用 -Dfile.encoding=UTF8 作为 VM 参数也有必要吗?
    • 是的。不要使用那个 VM 参数,它不相关
    • 关于使用 new String(remainingBytes,"UTF-8");dataString.getBytes("UTF-8") 中文字符是正确显示。但是 ® 不显示!!
    • 这个不正确的显示在哪里?您必须从端到端获得正确的编码,因此您的 JDBC 代码或显示输出中仍然可能存在错误。尝试阅读kunststube.net/encoding
    • 我不认为 JDBC 代码中存在错误,因为数据在遇到 ® 时也会变得混乱。我通过打印到控制台来检查。 AND dataString.indexOf(0) 在遇到 ® 时也会返回错误值。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2014-10-03
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多