如何在 Java 中执行与编码无关的字符串比较?

Viv*_*ath 5 string encoding equals string-comparison compareto

我在比较字符串时遇到一个奇怪的问题。getBytes()我从客户端向我的服务器发送一个字符串(使用字节作为字节)。我通过以-Dfile.encoding=UTF-8.

当我尝试对valueOf从客户端收到的字符串执行 a 以将其转换为枚举时,我注意到了这个问题。当我打印出字符串时,它们看起来完全一样。但是当我执行 a 时compareTo,我得到一个非零数字并equals返回false

我假设这是一个编码问题。但我不太确定——当谈到使用套接字进行客户端-服务器编程时,我仍然是一个新手。

这就是我得到的:

Waiting for connections on port 9090
Connected to client: 127.0.0.1
received command: GetAllItems
The value is |GetAllItems| (from client)
The value is |GetAllItems| (from enum)
equals: false
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

更新

以下是我如何从流中重构字符串。也许这就是我做错了什么?

byte[] commandBytes = new byte[1024];
in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes);
Run Code Online (Sandbox Code Playgroud)

Tim*_*tes 4

我的猜测是,由于您的缓冲区比字符串大,因此重构的字符串中添加了空值。在 Java 中将 null 嵌入到字符串中是合法的(与 C 和 Company 不同),尽管 Java 处理它们的方式与标准 UTF-8 不同。

尝试记录读取的长度,并将该长度传递给字符串构造函数:

int bytesRead = in.read(commandBytes);
String command = new String(commandBytes, 0, bytesRead);
Run Code Online (Sandbox Code Playgroud)