练习:按字节截取字符

import java.io.UnsupportedEncodingException;

public class TheLastTestForIO {

    public static void main(String[] args) throws UnsupportedEncodingException {

        /*
         * 按照字节数截取一个字符串,"abc你好"如果截取到半个中文,舍弃。
         * 比如,截取4个字节,abc,截取五个字节,abc你
         *
         * 字符串-->字节数组。编码
         * 字节数组-->字符串。解码。
         *
         *
         * 思路:
         * 1.中文两个字节都是负数
         * 2.判断截取的最后一个字节是否是负数
         * 如果不是,直接截取
         * 如果是,就往回判断前一个是否是负数,并记录住负数的个数,如果连续的负数个数有奇数个,舍弃最后一个字节
         *如果连续的负数是偶数个,不舍弃,欧耶!
         */

        //字符串转成字节数组
        String str = "abc你好";
        str = "a飝飝b飝";
        byte[] buf = str.getBytes("GBK");

        /*for(byte b:buf){
            System.out.println(b);
        }*/

        for (int i = 0; i < buf.length; i++) {
            String s =  cutStringByCount(str,i+1);
            System.out.println("截取"+(i+1)+"个字节是:"+s);
        }

    }

    public static String cutStringByCount(String str, int len) throws UnsupportedEncodingException {

        //1.将字符串转成字节数组,因为要判断截取的字节是否是负数,先有字节。
        byte[] buf = str.getBytes("GBK");
        //2.定义计数器,记录负数的个数
        int count = 0;
        //3.对字节数组进行遍历,应该从截取长度的最后一个字节开始判断,并往回判断
        for(int x=len-1;x>=0;x--){
            //4.遍历过程中只要是负数计数器就+1,只要不是负数,直接结束遍历
            if(buf[x]<0)count++;
            else break;
        }

        //5.对遍历后,计数器的值进行判断,奇数就舍弃最后一个字节,并将字节数组转成字符串。
        //偶数就不舍弃,将字节数组转成字符串
        if(count%2==0)
            return new String(buf,0,len);
        else
            return new String(buf,0,len-1);

    }

}
时间: 2024-10-13 02:43:28

练习:按字节截取字符的相关文章

C# 字符串按字节截取

/// <summary> /// 截取指定字节长度的字符串 /// </summary> /// <param name="str">原字符串</param> /// <param name="startIndex">起始位置</param> /// <param name="len">截取字节长度</param> /// <returns&g

java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”

/*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃.如果去四个字节就是“ab你”,取五个字节还是“ab你”.*/ 代码:其实是一个解码和编码的问题,要明白UTF-8码表和GBK码表的区别,UTF-8中用三个字节代表一个汉字,GBK使用2个字节代表一个汉字. 且在码表中都是用数字存放这些汉字.

按字节截取字符串

按字节截取字符串,参数:字符串,截取的字符          function getStr(str, n) {                 if (lenFor(str) <= n) {                     return str;                 }                 var tmpStr = str.substr(0, n);                 var tmpCode = tmpStr.replace(/[^\x00-\xf

C#截取字符串按字节截取SubString

public static string CutByteString(string str,int len) { string result=string.Empty;// 最终返回的结果 if(string.IsNullOrEmpty(str)) { return result; } int byteLen=System.Text.Encoding.Default.GetByteCount(str);// 单字节字符长度 int charLen=str.Length;// 把字符平等对待时的字

Java中根据字节截取字符串

一.简介 为了统一世界各国的字符集,流行开了Unicode字符集,java也支持Unicode编码,即java中char存的是代码点值,即无论是'A'还是'中'都占两个字节. 代码点值:与Unicode编码表中字符相对应的代码值: 代码单元:就是java中的一个char,可一个以认为是字符编码的基本单元 二.根据字节截取字符串的代码实现 public String getSubString(String str, int length) throws Exception { int i; int

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

matlab实现的手写体字符截取字符区域的方法

在提取手写体字符特征中如何更好的截取图像中字符区域是很重要的事. 下面就给出一种截取字符区域的方法,以使字符在图像中占据更多的位置 A=imread(filename); subplot(2,2,1); imshow(A); [N,M]=size(A); % A= bwmorph(A,'thin'); %A=im2bw(A); X=zeros(1);%%%行 Y=zeros(1);%%%列 i=1; j=1; for n=1:N for m=1:M if (A(n,m)~=0) X(:,i)=n

解惑:字、位、字节、字符、字符串。

1.字 就是我们所说的文字,如汉字,占2个字节(字不是计算机处理的数据,至少不是直接处理) 2.位(bit,比特) 这才是计算机中的最小数据单位,二进制数,如 一个0或1,这样的数据就叫一位 3.字节(byte) 是一种数据类型,一般 一个字节=8位, 字节是指一小组相邻的二进制数码(位).通常是8位作为一个字节.它是构成信息的一个小单位,并作为一个整体来参加操作 (所以,尽管最小的单位是位bit,但最常用的单位是字节byte 8位) 4.字符 字符人们使用的记号,抽象意义上的一个符号. '1'

批处理中set截取字符详解

set截取字符详解  在批处理中,set的功能有点繁杂:设置变量.显示环境变量的名及值.做算术运算.等待用户的输入.字符串截取.替换字符串,是我们常用的命令之一. 在字符串截取方面,新手因为没能注意到偏移量的问题,很容易提取到错误的字符串,因此,特开此帖,详细解释 set 截取字符的用法. 我们先来看一个例子: set str=123456789 现在,我需要提取变量 str 中的第一个字符,那么,该怎么写命令呢? set var=%str:~1,1%?我想,这很可能是很多粗懂set用法的新手们