• 编码解码练习---截取字节


    package test;
     
     
    import java.io.*;
    import java.nio.charset.Charset;
    import java.sql.SQLClientInfoException;
    import java.text.DateFormat;
    import java.text.ParsePosition;
    import java.text.SimpleDateFormat;
    import java.util.*;
    import java.util.concurrent.CountDownLatch;
    import java.util.zip.InflaterInputStream;
     
    import javax.annotation.processing.FilerException;
    import javax.management.RuntimeErrorException;
    import javax.swing.text.AbstractDocument.LeafElement;
    
    import privateclass.Filterby_Name;
    import privateclass.Filterby_hidden;
    import privateclass.Filterby_java;
    import privateclass.MyBufferedReader;
    import privateclass.Person;
     
    public class Main {
     
        private static final String space_operator = " ";
        private static final double pi = Math.PI;
        private static final String LINE_SEPARATOR = System.getProperty("line.separator");
    	private static final int SIZE = 1024*1024;
    
    	/*
    	 * 我们值到一个英文是一个字节
    	 * 一个中文在gbk里面是两个字节
    	 * 在utf-8里面是三个字节
    	 * 我们现在的要求是截取字节
    	 * 例如当我们的字符串是“aas你好呀”
    	 * 我们截取三个字节是aas;
    	 * 截取四个字节是aas
    	 * 截取五个字节是aas你
    	 */
        public static void main(String[] args) throws Exception {
    
        	String str = "aas你好呀";
        	int len = 0;
        	democutting(str);
        }
    
        public static void democutting(String str) throws IOException {
    		int len = str.getBytes().length;
    		byte buf[] = str.getBytes("gbk");
    		for(int i = 1; i <= len; i ++)
    		{
    			System.out.println("截取" + i + "个字节的结果是" + cuttinggbkbyte(str, i));
    		}
    		
    	}
    
    	/*
         * 我们知道gbk中的绝大多数字符是都是由两个负数组成
         * 思路:我们直接判断截取的字符尾是不是负数
         * 如果是负数我们就倒着数负数的个数如果是奇数个负数我们就舍弃尾数
         * 如果是偶数个我们就。。。
         * utf-8和这个方法基本相同就是判断的时候看是不是三的倍数不是三的倍数就舍弃
         * 
         *思考:为什么有些中文在gbk的编码是一正一负我们还能用到这个方法
         */
    	public static String cuttinggbkbyte(String str, int len) throws IOException {
    		
    		byte buf[] = str.getBytes("gbk");
    		int count = 0;
    		for(int i = len - 1; i >= 0; i --)
    		{
    			if(buf[i] < 0)
    			{
    				count++;
    			}
    		}
    		if(count % 2 == 1)
    		{
    			return new String(buf,0,len - 1);
    		}
    		else 
    		{
    			return new String(buf,0,len);
    		}
    	 	
    	}
    
    
    
    }
    

      

  • 相关阅读:
    python3的pygame的五子棋布局设置和代码详细分析
    RAID原理分析
    Python攻城狮教你用Pythin开机和关机,关机只需一条执行命令
    Python 之 MySql 每日一练 329——查询名字中含有风字的学生信息
    Python 之 MySql 每日一练 232——查询每门课程的平均成绩
    网络虚拟化基础协议·Geneve
    openstack octavia的实现与分析(一)openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
    Linux下多网卡绑定bond及模式介绍
    Python调试器-pdb的使用
    ubuntu server安装的一些坑
  • 原文地址:https://www.cnblogs.com/WINDZLY/p/11832060.html
Copyright © 2020-2023  润新知