Java网络编程的一个乱码问题


//客户端
import java.io.*;
import java.net.*;
public class Client {
    public static void main(String[] args) {
        String [] mess =
                {"珠穆朗玛峰的高度是多少?","亚洲有多少个国家?","西宁是哪个省的省会?"};
        Socket mysocket;
        DataInputStream in = null;
        DataOutputStream out = null;
        try{ mysocket = new Socket("127.0.0.1",2010);
             in = new DataInputStream(mysocket.getInputStream());
             out = new DataOutputStream(mysocket.getOutputStream());
             for(int i=0;i<mess.length;i++){
                 out.writeUTF(mess[i]);
                 String s = in.readUTF();
                 System.out.println("客户收到服务器的回答:"+s);
                 Thread.sleep(1000);
             }
        }
        catch(Exception e){
            System.out.println("服务器已断开"+e);
        }
    }
}
//服务器端
import java.io.*;
import java.net.*;
public class Server {
    public static void main(String[] args) {
        String [] answer = {"峰顶岩石面海拔8844.43米","48个","青海省"};
        ServerSocket serverForClient = null;
        Socket socketOnServer = null;
        DataOutputStream out = null;
        DataInputStream in = null;
        try{ serverForClient = new ServerSocket(2010);
        }
        catch (IOException e1){
            System.out.println(e1);
        }
        try{ System.out.println("等待客户呼叫");
            socketOnServer = serverForClient.accept();
            System.out.println("客户的地址:"+socketOnServer.getInetAddress());
            System.out.println("客户的端口:"+socketOnServer.getPort());
            out = new DataOutputStream(socketOnServer.getOutputStream());
            in = new DataInputStream(socketOnServer.getInputStream());
            for (int i=0;i< answer.length;i++){
                String s = in.readUTF();
                System.out.println("服务器收到客户的提问:"+s);
                out.writeUTF(answer[i]);
                Thread.sleep(1000);
            }
        }
        catch (Exception e){
            System.out.println("客户已断开"+e);
        }
    }
}

img

正在学习Java,遇到一个编码的问题,上面这个代码是关于Java网络编程的,我这里使用的是UTF-8编码,运行后出现了一部分乱码,这是怎么回事?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7725569
  • 你也可以参考下这篇文章:Java中的UTF-8、UTF-16编码字符所占字节数
  • 除此之外, 这篇博客: Java编程规范中的 【强制】文件编码格式必须是UTF-8 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在新增或修改文件时,文件的编码格式必须统一。编程领域,文件编码格式必须是UTF-8,不应为了个人方便使用其他编码格式,
    如GBK、ASCII等。

  • 以下回答来自chatgpt:

    可能的原因包括:

    1. 系统默认的编码不是UTF-8,可以通过在代码中指定编码方式来解决,例如:
    InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");
    
    1. 输出或输入的地方没有使用UTF-8编码,例如在读写文件或用网络传输数据时,需要明确指定编码方式。
    2. 在源文件中存在中文字符或其他非ASCII字符,如果编译器没有将这些字符正确地编码为UTF-8,可能会导致乱码。可以在编译器中检查默认编码,或手动将文件另存为UTF-8格式。
    3. 数据库或其他外部系统的编码方式与代码中指定的不一致,需要在连接时指定正确的编码方式。
    4. 在字符串转码时使用了错误的Java API函数,例如String.getBytes()没有指定编码方式而默认为平台默认编码。
    5. 在输出时使用了错误的字体或处理方式,例如在Swing GUI中使用了不支持UTF-8的字体。
    6. 操作系统的语言环境没有正确设置为UTF-8,需要在系统设置中进行更改。

    针对问题可能的解决方案包括:

    1. 检查代码中涉及的输入输出是否正确指定了UTF-8编码方式。
    2. 检查编译器和系统默认编码是否为UTF-8。
    3. 检查外部系统的编码方式是否与代码中指定的一致。
    4. 使用Java API中正确的编码转换函数,例如在字符串转换时使用String.getBytes("UTF-8")。
    5. 确认在Swing GUI中使用了正确支持UTF-8的字体。
    6. 确认操作系统设置为UTF-8环境。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^