Java 如何从服务器套接字读取unicode字符
我需要在服务器端接收客户端发送的unicode(UTF-8)字符串。字符串的长度当然是未知的Java 如何从服务器套接字读取unicode字符,java,sockets,utf-8,server,Java,Sockets,Utf 8,Server,我需要在服务器端接收客户端发送的unicode(UTF-8)字符串。字符串的长度当然是未知的 ServerSocket serverSocket = new ServerSocket(567); Socket clientSocket = serverSocket.accept(); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedRe
ServerSocket serverSocket = new ServerSocket(567);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
我可以使用.read()中的读取字节(直到返回-1),但问题是字符串是unicode,换句话说,每个字符由两个字节表示。因此,转换使用普通ascii字符的read()
的结果毫无意义
更新
根据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()+", ");
}
这是人们所期望的,但是为什么readLine方法不能产生“好”的结果呢?
无论如何,如果我们找不到实际的答案,我可能应该收集字节(如上所述)并从中创建字符串?怎么做
顺便说一句,我在windows上。使用新的InputStreamReader(clientSocket.getInputStream(),“UTF-8”)
为了在创建InputStreamReader
时正确设置读取来自客户端的InputStream
时要使用的字符集的名称,可以如下设置编码:
BufferedReader in =
new BufferedReader(
new InputStreamReader(clientSocket.getInputStream(), "UTF-8")
);
试着这样做:
Reader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream(), StandardCharsets.UTF_8));
注意课堂。它从Java1.7开始就受到支持,并提供了更优雅的方式来指定标准编码,如UTF-8
。这个解决方案似乎有效,但我有一些问题。我从客户端发送一个以\10\13结尾的字符串,在服务器端执行System.out.println(in.readLine())然而,我收到的是完全胡言乱语。有趣的是,如果我一个字节一个字节地读取数据,似乎一切都正常(例如,AB的编码是65,0,66,0或类似的)。只有我的字符串的第一个字母是正确的,其他的都是不可读的。在客户端,而不是发送\\ 10 \ 13,尝试发送两个字符:\U000 0D和\U000 0A。问题是客户端是C++的,而且我对该语言知之甚少。我更新了第一篇文章,包括一些关于我的问题的研究。
Reader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream(), StandardCharsets.UTF_8));