一箱子蛇果 2017-03-01 09:42 采纳率: 83.3%
浏览 2172

InputStream中如何解决中文乱码问题?

写了个简单的socket通讯的小程序,但是传入中文的时候输出一直是乱码,在网上看了资料得知是因为一次读一个byte,但是中文是两个byte导致每次读一半出错的。
求各大神指点。下面放上代码:
TCPSERVER服务端:

 class TCPServer{
    public static void main(String[] args)throws IOException{
        ServerSocket listen = new ServerSocket(5050);

        Socket server  = listen.accept();
        InputStream in = server.getInputStream();
        OutputStream out = server.getOutputStream();

        StringBuffer sb=new StringBuffer();
        int c;

        for(int i=0;i<20;i++)
        {
            sb.append((char)(c=in.read()));         
        }
        System.out.println("sb="+sb);
        MessageRule message=new MessageRule();
        message.unpack(sb);     

        if(message.getPrcsd().equals("2101"))
        {
            String s=new String(message.getBody(),"iso8859_1");
            System.out.println("s:"+s);
        }

        System.out.println("server收到:" + sb);
        out.write(message.getBody());   
        out.close();
        in.close();
        server.close();
        listen.close();
    }
}

TCPCLIENT客户端

 class TCPClient{
    public static void main(String[] args)throws IOException{
        Socket client = new Socket("127.0.0.1" , 5050);

        InputStream in = client.getInputStream();
        OutputStream out = client.getOutputStream();
        Filewriter file = new Filewriter();

        MessageRule message=new MessageRule();
        byte[] sendBye=message.pack("I'm 客户端!","2101");
        StringBuffer sbclient=new StringBuffer();
        out.write(sendBye);

        char  c ;
        for(int i=0;i<8;i++)
        {
            sbclient.append((char)(c=(char) in.read()));            
        }
        System.out.println("client收到:" + sbclient);

        out.close();
        in.close();
        client.close();
    }
}

下面是中间涉及的pack方法:

    public byte[] pack(String body,String prcsd)
    {
        length=prcsd.length()+body.length();
        String str = String.format("%08d", length);  
        String sTotal=str+prcsd+body;

        System.out.println("sTotal="+sTotal);
        try 
        {
            return sTotal.getBytes("iso8859_1");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

结果如下,中文是乱码

图片说明

  • 写回答

3条回答 默认 最新

  • shen_wei 2017-03-01 09:52
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 制裁名单20240508芯片厂商
  • ¥20 易康econgnition精度验证
  • ¥15 线程问题判断多次进入
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接