我有一个包含字符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字符显示为“?”。
我觉得这是一个编码问题,但似乎无法使其正常工作。
答案 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)