【问题标题】:Java Client/Server does not return UTF-8 stringJava 客户端/服务器不返回 UTF-8 字符串
【发布时间】: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


【解决方案1】:

使用此行:PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 您正在将字节流(即InputStream / OutputStream 转换为字符流(即Reader / Writer)。任何时候你这样做,如果你没有指定编码,你得到的是平台默认值,这不太可能是你想要的。

您(和@IharSadounikau)看到了不同的结果,因为“平台默认值”正在您身上切换。这是您永远不想使用它的原因之一。找出您的代码存在的错误,只有在您的平台默认编码与开发它的人相同时才能正常工作——通常是不可测试

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

【讨论】:

  • 好的,我更新了我的 JDK,更新了我的 gradle,改变了我所有的运行/构建并实现了你的解决方案,但仍然是问号。我错过了什么吗?
  • 只打印该行。单行:System.out.println("Greek chars here")。这会显示问号吗?然后是 powershell 配置错误或无法打印这些。
【解决方案2】:

也许这会有所帮助:

String msgEncode = URLEncoder.encode(msg, "UTF-8");
printWriter.println(msgEncode);

还有:

String line = bufferedReader.readLine();
String msgDecode = URLDecoder.decode(line, "UTF-8");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2011-06-07
    • 2018-10-03
    • 2016-11-13
    • 1970-01-01
    • 2023-03-27
    • 2011-01-05
    相关资源
    最近更新 更多