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