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

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 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换