我在比较字符串时遇到了一个奇怪的问题。我从客户端向我的服务器发送一个字符串(使用getBytes()
作为字节)。通过-Dfile.encoding=UTF-8
启动它们,我确保客户端和服务器上的编码是相同的。
当我尝试对从客户端收到的字符串执行valueOf
时,我注意到了这个问题,将其转换为枚举。当我打印出字符串时,它们看起来完全相同。但是当我执行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
我做错了什么?
更新
以下是我如何重构流中的字符串。也许这就是我做错了什么?
byte[] commandBytes = new byte[1024];
in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes);
答案 0 :(得分:4)
我的猜测是,因为你的缓冲区大于你的字符串,所以在重构字符串中添加了空值。尽管Java处理它们与标准UTF-8的处理方式不同,但在Java中嵌入字符串中的空值是合法的(不像C和公司)。
尝试记录读取的长度,并将该长度传递给字符串构造函数:
int bytesRead = in.read(commandBytes);
String command = new String(commandBytes, 0, bytesRead);
答案 1 :(得分:3)
您的问题在于如何构建字符串。您正在将字节读入缓冲区长度1024,但您并没有告诉String构造函数只查看相关点。所以你的代码应该是......
byte[] commandBytes = new byte[1024];
int length = in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes, 0, length);
答案 2 :(得分:2)
使用java.text.Collator
来比较字符串。