我需要在服务器端接收客户端发送的unicode(UTF-8)字符串。字符串的长度当然是未知的。
ServerSocket serverSocket = new ServerSocket(567);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
我可以使用in.read()
读取字节(直到它返回-1),但问题是字符串是unicode,换句话说,每个字符由两个字节表示。因此,将read()
的结果转换为正常的ascii字符是没有意义的。
根据bello的建议,我创建了如下读者:
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));
我已将客户端更改为在每个字符串后发送换行符(#10#13
)。
但是新问题是如果我打电话,我会得到废话而不是真正的字符串:
in.readLine();
打印结果我得到一些无意义的字符串(我甚至不能在这里复制)虽然我没有处理非拉丁字符或其他任何东西。
为了了解发生了什么,我介绍了以下代码:
int j = 0
while (j < 255){
j++;
System.out.print(in.read()+", ");
}
所以这里我只打印收到的所有字节。如果我发送“ab”,我会得到:
97, 0, 98, 0, 10, 13,
这是人们所期望的,但是为什么readLine方法不会产生“好”的结果? 无论如何,如果我们找不到实际的答案,我应该收集字节(如上所述)并从中创建我的字符串?怎么做?
P.S。只是一个快速的说明 - 我在窗户上。
答案 0 :(得分:4)
使用charset
以便在阅读来自客户的InputStream
时正确设置要使用的campaign
的名称
答案 1 :(得分:3)
创建InputStreamReader
时,您可以设置如下编码:
BufferedReader in =
new BufferedReader(
new InputStreamReader(clientSocket.getInputStream(), "UTF-8")
);
答案 2 :(得分:2)
尝试这种方式:
Reader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream(), StandardCharsets.UTF_8));
请注意StandardCharsets课程。从Java 1.7开始支持它,并提供更优雅的方式来指定标准编码,如UTF-8
。