【发布时间】:2020-03-08 22:34:48
【问题描述】:
我试图通过 Java Socket 传递一个 UTF-8 字符串。
字符串包含英语和希腊语的混合体。
我的问题是,当消息通过套接字时,所有希腊字符都会变成“?”。
我已经尝试将 InputStream 字符集设置为 UTF-8。
以下是我的尝试,任何帮助将不胜感激。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) {
try {
String msg = "This is a test - Αυτο ειναι μια δοκιμη";
ServerSocket serverSocket = new ServerSocket(9999);
Thread host = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Socket socket = serverSocket.accept();
if (socket != null) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
while (true) {
String line = bufferedReader.readLine();
if (line != null) {
System.out.println(line);
} else if(bufferedReader.read() < 0) {
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
host.start();
Socket socket = new Socket("127.0.0.1", 9999);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
编辑 1
我通过 IntelliJ Idea 运行和构建我的代码,这就是我发现问题的地方。
但在@Ihar Sadounikau 发表评论后,我更新了我的 JDK 并尝试通过 PowerShell 构建和运行,但问题仍然存在。
这是我的结果
& 'C:\Program Files\Java\jdk-13.0.2\bin\java.exe' Main
这是一个测试 - ??τ? ε??α? ??αδ?????
【问题讨论】:
-
完美运行,没有任何问号。尝试重新编译该类。我使用 Java 11 进行测试,不确定这是一个问题
-
javadoc of PrintWriter: "从现有的 OutputStream 创建一个新的 PrintWriter。这个便利的构造函数创建了必要的中间 OutputStreamWriter,它将使用 默认字符编码将字符转换为字节>。” (假设控制台可以显示字符)
标签: java sockets encoding utf-8 character-encoding