程序员Java 杂谈码农的世界

2019-03-08

2019-03-08  本文已影响4人  DreamPath

io流之编码解码

字符编码

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

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

常见的:

字符串--编码(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");
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读