包含中文的字符串中截取前N个字符

package com.wangzhu.string;

import java.io.UnsupportedEncodingException;

public class SubStringDemo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
    String str = "我是j好abc";
    String charset = "UTF-8";
    printGetStrByLen(str, charset);
    charset = "GBK";
    printGetStrByLen(str, charset);

    str = "我ABC汉字d";
    charset = "UTF-8";
    printGetStrByLen(str, charset);
    charset = "GBK";
    printGetStrByLen(str, charset);

    // 我是j好abc====编码方式===UTF-8
    // 我是j好abc====0
    // 3===0
    //
    //
    // 我是j好abc====1
    // 3===0
    //
    //
    // 我是j好abc====2
    // 3===0
    //
    //
    // 我是j好abc====3
    // 3===1
    // 我
    //
    // 我是j好abc====4
    // 6===1
    // 我
    //
    // 我是j好abc====5
    // 6===1
    // 我
    //
    // 我是j好abc====6
    // 6===2
    // 我是
    //
    // 我是j好abc====7
    // 7===3
    // 我是j
    //
    // 我是j好abc====8
    // 10===3
    // 我是j
    //
    // 我是j好abc====9
    // 10===3
    // 我是j
    //
    // 我是j好abc====10
    // 10===4
    // 我是j好
    //
    // 我是j好abc====11
    // 11===5
    // 我是j好a
    //
    // 我是j好abc====12
    // 12===6
    // 我是j好ab
    //
    // 我是j好abc====13
    // 我是j好abc
    //
    // 我是j好abc====14
    // 我是j好abc
    //
    // -------------
    // 我是j好abc====编码方式===GBK
    // 我是j好abc====0
    // 2===0
    //
    //
    // 我是j好abc====1
    // 2===0
    //
    //
    // 我是j好abc====2
    // 2===1
    // 我
    //
    // 我是j好abc====3
    // 4===1
    // 我
    //
    // 我是j好abc====4
    // 4===2
    // 我是
    //
    // 我是j好abc====5
    // 5===3
    // 我是j
    //
    // 我是j好abc====6
    // 7===3
    // 我是j
    //
    // 我是j好abc====7
    // 7===4
    // 我是j好
    //
    // 我是j好abc====8
    // 8===5
    // 我是j好a
    //
    // 我是j好abc====9
    // 9===6
    // 我是j好ab
    //
    // 我是j好abc====10
    // 我是j好abc
    //
    // 我是j好abc====11
    // 我是j好abc
    //
    // -------------
    // 我ABC汉字d====编码方式===UTF-8
    // 我ABC汉字d====0
    // 3===0
    //
    //
    // 我ABC汉字d====1
    // 3===0
    //
    //
    // 我ABC汉字d====2
    // 3===0
    //
    //
    // 我ABC汉字d====3
    // 3===1
    // 我
    //
    // 我ABC汉字d====4
    // 4===2
    // 我A
    //
    // 我ABC汉字d====5
    // 5===3
    // 我AB
    //
    // 我ABC汉字d====6
    // 6===4
    // 我ABC
    //
    // 我ABC汉字d====7
    // 9===4
    // 我ABC
    //
    // 我ABC汉字d====8
    // 9===4
    // 我ABC
    //
    // 我ABC汉字d====9
    // 9===5
    // 我ABC汉
    //
    // 我ABC汉字d====10
    // 12===5
    // 我ABC汉
    //
    // 我ABC汉字d====11
    // 12===5
    // 我ABC汉
    //
    // 我ABC汉字d====12
    // 12===6
    // 我ABC汉字
    //
    // 我ABC汉字d====13
    // 我ABC汉字d
    //
    // 我ABC汉字d====14
    // 我ABC汉字d
    //
    // -------------
    // 我ABC汉字d====编码方式===GBK
    // 我ABC汉字d====0
    // 2===0
    //
    //
    // 我ABC汉字d====1
    // 2===0
    //
    //
    // 我ABC汉字d====2
    // 2===1
    // 我
    //
    // 我ABC汉字d====3
    // 3===2
    // 我A
    //
    // 我ABC汉字d====4
    // 4===3
    // 我AB
    //
    // 我ABC汉字d====5
    // 5===4
    // 我ABC
    //
    // 我ABC汉字d====6
    // 7===4
    // 我ABC
    //
    // 我ABC汉字d====7
    // 7===5
    // 我ABC汉
    //
    // 我ABC汉字d====8
    // 9===5
    // 我ABC汉
    //
    // 我ABC汉字d====9
    // 9===6
    // 我ABC汉字
    //
    // 我ABC汉字d====10
    // 我ABC汉字d
    //
    // 我ABC汉字d====11
    // 我ABC汉字d
    //
    // -------------

    }

    public static void printGetStrByLen(String str, String charset)
        throws UnsupportedEncodingException {
    System.out.println(str + "====编码方式===" + charset);
    for (int i = 0, len = str.getBytes(charset).length + 2; i < len; i++) {
        System.out.println(getStrByLen(str, i, charset, false));
        System.out.println();
    }
    System.out.println("-------------");
    }

    /**
     * 截取字符串【UTF-8:3个byte,GBK:2个byte】
     *
     * @param str
     * @param len
     * @param charset
     * @param flag
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String getStrByLen(String str, int len, String charset,
        boolean flag) throws UnsupportedEncodingException {
    System.out.println(str + "====" + len);
    byte[] buf = str.getBytes(charset);
    int step = 1;
    if (charset.equals("UTF-8")) {
        step = 2;
    }
    int length = buf.length;
    if (len >= length) {
        return str;
    }
    int count = 0, size = 0;
    for (int i = 0; i < length; i++) {
        count++;
        if (buf[i] < 0) {
        // 汉字
        i += step;
        count += step;
        }
        size++;
        if (count >= len) {
        if (!flag) {
            if ((count > len) && (buf[i] < 0)) {
            size--;
            }
        }
        System.out.println(count + "===" + size);
        return str.substring(0, size);
        }
    }
    return null;
    }
}
时间: 2024-10-13 17:30:20

包含中文的字符串中截取前N个字符的相关文章

vb.net中,如何把byte array还原成为包含中文的字符串

这个问题,在网上好找了半天,但说实在话,不得不说,现在的程序员,脑子都僵化了. 一个能解决的也没有. 这还不说,多数人指出应当两边都用UNICODE,不要用ASC 2码之类的.我想说,这些是人家问的吗?不懂就是不懂,要是我就这样,何必不懂还要瞎JB指挥? 但我要说,这正是知其然不知其所以然,正确的回答,永远是先解释完提出问题的人,然后解决之. 然后,如果你愿意画蛇添足,再加上自己的想法.不想多说了,正确的代码我放在这里: '====================================

在一个字符串中截取指定字符串,域名截取,尝试截取不同网址的域名?

/** * 在一个字符串中截取指定字符串,域名截取,尝试截取不同网址的域名? *比如www.163.com,www.sohu.com.cn * 字符串截取就需要用subString() * 索引的位置,这里需要找第一个"."作为每次域名的开始索引,然后找下一个("."+1)作为结束位置 * 第一个点好找,indexOf搞定,第二点,用indexOf(".",之前的"."+1)找到 */ public class StringD

JS 从一个字符串中截取两个字符串之间的字符串

/************************************************* 函数说明:从一个字符串中截取 两个字符串之间的字符串 参数说明:src_str 原串, start_str_loc开始查找的字符串, start_str起始字符串 end_str结束字符串 dep :两个字符串之间的字符串 /************************************************/ function analysysRespParam(src_str,s

[华为上机练习题]7.删除字符串中出现次数最少的字符

题目 描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 题目类别: 字符串 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 代码 /*------------------------

删除字符串中出现次数最少的字符

题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出描述: 删除字符串中出现次数最少的字符后的字符串. 输入例子: abcdd 输出例子: dd 思路:(我的思路有点绕弯,先记录下来,后面有网友简洁思路),首先把字符串元素存入list中,继续以key-字符,value-出现次数存入map中,然后map按照val

31:删除字符串中出现次数最少的字符

题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述:字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出描述:删除字符串中出现次数最少的字符后的字符串. 输入例子: abcdd 输出例子: dd 思路:统计各个字符出现的次数,放在LinkedHashMap里,可以把values取出来放到一个collection里,直接调用collection的min()得到出现次

算法基础:删除字符串中出现次数最少的字符(Golang实现)

描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串, 字符串中其它字符保持原来的顺序. 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 代码实现 package huawei import ( "fmt" ) func Test4Base() { s := "abcfbcca"

华为OJ在线软件训练题——删除字符串中出现次数最少的字符(中级)

删除字符串中出现次数最少的字符 描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除. 输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 题目类别: 字符串 难度: 中级 分数:   运行时间限制: 10 Sec 内存限制: 128 MByte 阶段: 招聘管理 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 对于此类题目,简

【华为OJ】【022-删除字符串中出现次数最少的字符】

[华为OJ][算法总篇章] [华为OJ][022-删除字符串中出现次数最少的字符] [工程下载] 题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出描述 删除字符串中出现次数最少的字符后的字符串. 输入例子 abcdd 输出例子 dd 算法实现 import java.util.*; /** * Author: