2019-03-08

作者: DreamPath | 来源:发表于2019-03-08 22:40 被阅读4次

    io流之编码解码

    字符编码

    存储:
    - 在计算机中储存字符都是存储的所对应的数值以二进制的形式表示

    展示:
    - 去相关的编码表中查找该值(存储的值)所对应的字符。

    常见的:

    • 1.ASCII表: 用7bit来表示存储数据,对应的字节都是正数。0-xxxxxxx
    • 2.ISO-8859-1: 拉丁码表latin。一个字节8位。1-xxxxxxxx 负数
    • 3.GB2312: 简体中文编码(国标码)。只涵盖六七千的简体中文和字符。一个字用两个字节表示。两个字节都是开头为1----负数
    • 4.GBK:2万的中文和符号 ,两个字节表示一个字,其中一部分文字,第一个字节开头是1,第二个开头是0。gb2312做了增强(做中文网站就够了)
    • 5.GB18030: 对GBK做了增强
    • 6.BIG5: 支持繁体中文
    • 7.Uniclde:国际标准码表,无论什么字符,都用两个字节来储存,java中的char类型就是用的这个码表来存储。char c='a' 占用两个字节。在Java中字符串和简体中文默认编码为GBK。
    • 8.UTF-8:(首选编码)支持多种国家的语言,针对不同字符的范围给出不同的字节表示。0,a,A用一个字节存储,中间的字节用两个字节,中文就使用三个字节
      注意:
    • 写入的编码和读取的编码必须要一致,否只会有乱码。

    字符串--编码(getBytes())-->字节数组
    字节数组--解码(new String(byte [ ]))-->字符串

    import java.io.UnsupportedEncodingException;
    
    public class transString {
        public static void main(String[] args) throws UnsupportedEncodingException {
                String str="你好";
                String str1="琲";//bei四声
                /*
              你好:
                utf-8编码:-28 -67 -96 -27 -91 -67   三个字节一个文字
                GBK编码:  -60 -29 -70 -61           两个字节一个字
              琲:
                utf-8编码:-25 -112 -78 
                GBK编码: -84 105
             GBK解码原理:当第一个字节数为负数时,会接着读取下一个字节再去查询码表解码
                         读取过程中出现0开头的正数时会直接查询码表。
                 */
    
            byte[] bytes = str1.getBytes();
    //        遍历字节数组
            for (int i = 0; i <bytes.length ; i++) {
                System.out.print(bytes[i]+" ");
            }
            System.out.println();
            String s = new String(bytes, "GBK");
    
            //默认的是utf-8编码格式,当前解码使用的是GBK,因此解析出来的文字会出现乱码
            System.out.println(s);//鐞�
    
            String s1 = new String(bytes, "utf-8");
            System.out.println(s1);//琲
    
        }
    }
    

    字符串按照字节截取

    import java.io.UnsupportedEncodingException;
    import java.util.Scanner;
    
    /**
     * 需求:对字符串按照字节数截取  比如  abc你好  其中有五个字符 七个字节
     * 分析:
     * 按照三个字节截取abc 四个截取会得到abc加上字的一半,故应该舍弃最后一个字节
     * 使用GBK的截取方式要根据解码原理进行分析
     */
    public class StringJieQu {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String s = "abc你好md猛兽族";
            byte[] bytes = s.getBytes("GBK");
            Scanner scan = new Scanner(System.in);
            while (true) {
                System.out.println("请输入截取字节个数:");
                int i = scan.nextInt();
                if (i > bytes.length || i <= 0) {
                    //如果输入的是-1表示退出
                    if (i == -1) {
                        break;
                    }
                    System.out.println("输入的数字不正确,请重新输入");
                    continue;
                }
                //创建截取字符串的方法
                String s1 = cutString(s, i);
                System.out.println("截取" + i + "个字节得到的字符串为:" + s1);
    
                break;
            }
        }
    
        private static String cutString(String s, int len) throws UnsupportedEncodingException {
            int count = 0;
            //将字符串转化成字节数组
            byte[] bytes = s.getBytes("GBK");
    
            for (int i = len - 1; i >= 0; i--) {
                //判断最后一位是否是负数
                if (bytes[i] < 0) {
                    count++;
                } else {
                    break;
                }
    
            }
            //判断奇偶数
            if (count % 2 == 0) {
                return new String(bytes, 0, len, "GBK");
            } else {
                return new String(bytes, 0, len - 1, "GBK");
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:2019-03-08

        本文链接:https://www.haomeiwen.com/subject/nbirpqtx.html