Java Socket客户端获取字符乱码(Win)下

最近在琢磨Socket和多线程编程的时候, 发现在Win10下打包出来的Jar文件单独运行的时候, 获取到的文字会成为乱码( 此问题Mac下和Win的Idea下都没有出现, 只有Win10 build jar之后会遇到)

解决办法很简单, 在Client通过Socket获取流输入的时候转换成 UTF-8 编码就Ok了

try{
            Socket s = new Socket("104.243.20.178",4242);

            InputStreamReader streamReader = new InputStreamReader(s.getInputStream(),"UTF-8");
            BufferedReader reader = new BufferedReader(streamReader);

            String advice = reader.readLine();
            displayMessage = advice;

//          displayMessage = new String(advice.getBytes("UTF-8"));

            System.out.println("Today you should:" + advice);
            reader.close();
}catch (IOException ex){
            ex.printStackTrace();
}

注意: 在获取完Stream之后修改String的编码方式是没有用的, 见代码块中被注释掉的一段

Java Socket客户端中,字符集的选择通常是用来处理和传输数据时编码或解码字符串所用的。当你创建一个Socket连接并进行通信时,如果涉及到文本数据(如字符串),你需要指定字符集以便正确地解析输入和输出。 例如,如果你知道服务器端发送的数据是按照UTF-8编码的,那么你应该在客户端设置相应的字符集为`StandardCharsets.UTF_8`。这样,当从网络接收字节流时,会转换成UTF-8字符,反之亦然,发送数据之前也应将其编码为UTF-8。 以下是一个简单的示例: ```java import java.io.*; import java.nio.charset.StandardCharsets; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException { String charsetName = "UTF-8"; Socket socket = new Socket("localhost", 9000); // 假设服务器端口为9000 BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream(), StandardCharsets.forName(charsetName)) ); DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); writer.writeUTF("你好,这是UTF-8编码的消息"); // 发送UTF-8编码的字符串 String messageFromServer = reader.readLine(); // 读取服务器响应 System.out.println("Received: " + messageFromServer); socket.close(); } } ``` 这里,`StandardCharsets.forName(charsetName)`用于根据给定的名字获取字符集实例。如果字符集选择错误,可能会导致乱码或无法正确解析数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值