我试图通过Java套接字传递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'主要
  这是一个测试-??τ? ε??α? ??αδ????????

最佳答案

这行代码:PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);您正在将字节流(即InputStream / OutputStream转换为字符流(即Reader / Writer)。无论何时执行此操作,如果未能指定编码,您将获得平台默认值,这不太可能是您想要的。

您(和@IharSadounikau)看到的结果不同,因为“平台默认值”正在您身边切换。这是您永远不想使用它的原因之一。弄清楚您的代码具有仅在您的平台默认编码与开发人员相同的情况下才有效的错误-通常无法测试。

尝试new PrintWriter(socket.getOutputStream(), true, StandardCharsets.UTF_8)

10-07 15:56
查看更多