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

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条回答

  • sun1021873926 夕阳雨晴 4年前

    在编程环境或者传递过程,最好使用统一的utf-8编码。

    点赞 评论 复制链接分享
  • oyljerry oyljerry 4年前

    你用了iso8859编码?直接把中文用utf8编码再发送,接受的时候再转换回utf8

    点赞 评论 复制链接分享
  • shen_wei shen_wei 4年前