java中单字节操作过程(byte转String 字符问题)

java中如果涉及到单字节操作,如果直接转换为String等,会有信息丢失或异常字符,

简单整理如下,这里可以再回顾下字符知识(ISO8859-1是单字节存储,GBK是双字节),

别名是Latin1,Iso-8859-1编码是属于单字节的编码,即编码的范围是0到255.总共能表示256个字符,向下兼容了ACSII,也就是在ASCII编码的基础上扩展了127-255之间位置。编码范围是0x00-0xFF,涵盖了部分西欧的语言字符.由于和计算机的存储单元一样,应用比较广泛,例如在网络传输协议中和Mysql数据库默认的编码。
 

参考https://blog.csdn.net/lili13897741554/article/details/82053351

代码示例:

// 返回客户端信息
        InputStream input = socket.getInputStream();
        byte[] bte = new byte[1024];
        int len;
        StringBuilder sb = new StringBuilder();
        while ((len = input.read(bte)) != -1) {
            //发现转换后,字节被变更
            sb.append(new String(bte, 0, len, "iso8859-1"));
        }
        
        //获取系统默认编码  
        System.out.println(System.getProperty("file.encoding"));   
        //获取系统默认的字符编码 
        System.out.println(Charset.defaultCharset()); 
        //获取系统默认语言
        System.out.println(System.getProperty("user.language"));

        //Java中byte[]转String问题 丢失字节;ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。
        //new String使用其他编码如GBK,GB2312的话一样也会导致字节数组发生变化,因此要想获取String里单字节数组,就应该使用iso8859-1编码
        System.out.println("Start.info from client :" + sb.toString());
        String resp = sb.toString();
        byte[] srcBuf = resp.getBytes("iso8859-1");

你可能感兴趣的:(java,web)