在客户端收到Unicode字符后无法正确显示

时间:2019-06-16 20:35:58

标签: java

我有一个包含字符string ="\u2663\"的字符串 其中。 我使用printwriter在套接字上发送字符串,并使用缓冲读取器进行读取:

PrintWriter out = new PrintWriter(c.clientSocket.getOutputStream(),true); out.println(string)

BufferedReader in = new BufferedReader(new InputStreamReader(mainSocket.getInputStream())); in.readLine()

当代码在eclipse中运行时,它可以正确呈现,但是当通过可执行jar测试时,上面的unicode字符显示为“?”。

我觉得这是一个编码问题,但似乎无法使其正常工作。

2 个答案:

答案 0 :(得分:0)

我很确定我知道发生了什么,尽管我仍然需要实施变通方法。

要使用上面的unicode字符,我将Eclipse文本文件的编码从默认(Cp1252)切换为UTF-8。但是,运行jar时,我很确定它正在使用默认的Cp1252。当我将eclipse设置更改回默认值时,会得到相同的结果。

由于PrintWriter使用默认字符编码,因此我将不得不找到一种方法以UTF-8输出或强制JRE覆盖默认值并使用UTF-8。

答案 1 :(得分:0)

套接字正在传输字节,而不是字符。您正在发送的字符串将被转换为字节,然后再次返回,但使用默认编码。之所以在您的IDE中起作用,而不是在外部起作用,是因为使用了不同的默认编码。

您应该在套接字的两侧显式使用合适的编码(例如UTF-8)

new BufferedReader(new InputStreamReader(mainSocket.getInputStream()),StandardCharsets.UTF_8)
new PrintWriter(new OutputStreamWriter(c.clientSocket.getOutputStream(),StandardCharsets.UTF_8),true)