.net<->Java 文本编码在开发环境中有效,但在 "production" 时失败
.net<->Java text encoding works in development environment but fails at "production"
我将以下字节数组从 Java 应用程序发送到 Vb.Net 应用程序:
byte[] buffer = "<CMD>{§}SETUP US THE BOMB".getBytes("UTF-16LE");
下面是Vb.Net端如何将数组解析成String:
Dim result as String = (New System.Text.UnicodeEncoding(False, False)).GetString(buffer)
之后,我将结果字符串记录到控制台(字节转储在 VB.Net 到达时完成):
HEX: 60 0 67 0 77 0 68 0 62 0 123 0 167 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
STR: <CMD>{§}SETUP US THE BOMB
如果我不使用 eclipse,接收到的字节数组是不同的,而且编码似乎有问题...
HEX: 60 0 67 0 77 0 68 0 62 0 123 0 239 0 191 0 189 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
STR: <CMD>{�}SETUP US THE BOMB
当我从开发切换到代码的实际使用时,Java 端似乎发生了一些事情。
字节数组使用 Udp 传输在本地发送到 Vb.Net 应用程序。
我正在使用普通 java.net.datagramsocket 进行通信。
更新
我也尝试从 Java 获取数组,因为我认为它可能会有帮助:
[D]=Development [P]=Production [J]=Java [R]=Received by Vb.Net
[D][J]: 60 0 67 0 77 0 68 0 62 0 123 0 -89 0 125 0 83 0 69...
[D][R]: 60 0 67 0 77 0 68 0 62 0 123 0 167 0 125 0 83 0 69...
[P][J]: 60 0 67 0 77 0 68 0 62 0 123 0 -17 0 -65 0 -67 0 125 0 83 0 69...
[P][R]: 60 0 67 0 77 0 68 0 62 0 123 0 239 0 191 0 189 0 125 0 83 0 69...
肯定有问题,好像字符串在发送之前被重新编码了。
这篇评论太长了,但它不是真正的答案...
我已尝试在 VB .NET 中对字符串进行编码,但我的字节数与您不同:
Dim buf As Byte()
buf = System.Text.UnicodeEncoding.Unicode.GetBytes("<CMD>{§}SETUP US THE BOMB")
这导致:
60 0 67 0 77 0 68 0 62 0 123 0 167 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
而来自 Java 的缓冲区是:
60 0 67 0 77 0 68 0 62 0 123 0 239 0 191 0 189 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
所以我想说问题出在 Java 编码上,因为该字符应该输出为两个六进制数而不是六个...
我终于找到了问题所在,因为我使用的外部工具 (gradle) 不会将我的 *.java 文件视为 UTF-8/16(和 eclipse 一样)但是和 Latin/windows/something else 一样,然后“§”字面量不会被转义。
为了解决这个问题,我不得不将“§”转义为“\u00A7”。
PS。我认为 gradle 中的一些配置技巧允许跳过转义,但由于我没有完全控制开发环境,所以我没有进一步调查。
我将以下字节数组从 Java 应用程序发送到 Vb.Net 应用程序:
byte[] buffer = "<CMD>{§}SETUP US THE BOMB".getBytes("UTF-16LE");
下面是Vb.Net端如何将数组解析成String:
Dim result as String = (New System.Text.UnicodeEncoding(False, False)).GetString(buffer)
之后,我将结果字符串记录到控制台(字节转储在 VB.Net 到达时完成):
HEX: 60 0 67 0 77 0 68 0 62 0 123 0 167 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
STR: <CMD>{§}SETUP US THE BOMB
如果我不使用 eclipse,接收到的字节数组是不同的,而且编码似乎有问题...
HEX: 60 0 67 0 77 0 68 0 62 0 123 0 239 0 191 0 189 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
STR: <CMD>{�}SETUP US THE BOMB
当我从开发切换到代码的实际使用时,Java 端似乎发生了一些事情。
字节数组使用 Udp 传输在本地发送到 Vb.Net 应用程序。
我正在使用普通 java.net.datagramsocket 进行通信。
更新
我也尝试从 Java 获取数组,因为我认为它可能会有帮助:
[D]=Development [P]=Production [J]=Java [R]=Received by Vb.Net
[D][J]: 60 0 67 0 77 0 68 0 62 0 123 0 -89 0 125 0 83 0 69...
[D][R]: 60 0 67 0 77 0 68 0 62 0 123 0 167 0 125 0 83 0 69...
[P][J]: 60 0 67 0 77 0 68 0 62 0 123 0 -17 0 -65 0 -67 0 125 0 83 0 69...
[P][R]: 60 0 67 0 77 0 68 0 62 0 123 0 239 0 191 0 189 0 125 0 83 0 69...
肯定有问题,好像字符串在发送之前被重新编码了。
这篇评论太长了,但它不是真正的答案...
我已尝试在 VB .NET 中对字符串进行编码,但我的字节数与您不同:
Dim buf As Byte()
buf = System.Text.UnicodeEncoding.Unicode.GetBytes("<CMD>{§}SETUP US THE BOMB")
这导致:
60 0 67 0 77 0 68 0 62 0 123 0 167 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
而来自 Java 的缓冲区是:
60 0 67 0 77 0 68 0 62 0 123 0 239 0 191 0 189 0 125 0 83 0 69 0 84 0 85 0 80 0 32 0 85 0 83 0 32 0 84 0 72 0 69 0 32 0 66 0 79 0 77 0 66 0
所以我想说问题出在 Java 编码上,因为该字符应该输出为两个六进制数而不是六个...
我终于找到了问题所在,因为我使用的外部工具 (gradle) 不会将我的 *.java 文件视为 UTF-8/16(和 eclipse 一样)但是和 Latin/windows/something else 一样,然后“§”字面量不会被转义。
为了解决这个问题,我不得不将“§”转义为“\u00A7”。
PS。我认为 gradle 中的一些配置技巧允许跳过转义,但由于我没有完全控制开发环境,所以我没有进一步调查。