包含中文的字符串中截取前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;
}
}
包含中文的字符串中截取前N个字符的更多相关文章
- java截取字符串中的最后几个字符
Java中的String类提供了一个substring(int from, int to)方法用于截取字符串中位置为from到to-1位置的字符. 因为字符串的字符位置是从0开始的,而substrin ...
- 有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
[提交][状态][讨论版] 题目描述 有一字符串,包含n个字符.写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串. 输入 数字n 一行字符串 数字m 输出 从m开始的子串 样例输入 ...
- oracle中一个字符串包含另一个字符串中的所有字符
oracle中一个字符串包含另一个字符串中的所有字符 --解决监理报告中所勾选的标段信息,与该用户所管理的标段字符串不匹配的问题. select * from a where instr(a,b)&g ...
- JS 从一个字符串中截取两个字符串之间的字符串
/************************************************* 函数说明:从一个字符串中截取 两个字符串之间的字符串 参数说明:src_str 原串, start ...
- 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符
string stra = "abcdefghijk";string strtempa = "c";string strtempb = "j" ...
- LeetCode初级算法之字符串:387 字符串中的第一个唯一字符
字符串中的第一个唯一字符 题目地址:https://leetcode-cn.com/problems/first-unique-character-in-a-string/ 给定一个字符串,找到它的第 ...
- Leecode刷题之旅-C语言/python-387 字符串中的第一个唯一字符
/* * @lc app=leetcode.cn id=387 lang=c * * [387] 字符串中的第一个唯一字符 * * https://leetcode-cn.com/problems/f ...
- leecode刷题(13) -- 字符串中的第一个唯一字符
leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...
- Java求字符串中出现次数最多的字符
Java求字符串中出现次数最多的字符 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51933611 Java ...
随机推荐
- jQuery学习-----(二)JQuery对象与DOM对象的区别与转换
1.jQuery对象和DOM对象的区别 DOM对象,即是我们用传统的方法(javascript)获得的对象,jQuery对象即是用jQuery类库的选择器获得的对象; eg: var domObj = ...
- 设置Linux时间 同步时间
date命令将日期设置为2014年6月18日 ---- date -s 06/18/14 将时间设置为14点20分50秒 ---- date -s 14:20:50 将时间设置为2014年6月 ...
- 【Qt】Qt之进程间通信(Windows消息)【转】
简述 通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信. 简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设置标题 重写 ...
- Silverlight C#动态设置样式
1.从页面资源中获取样式并应用 btnTest.Style = (Style)this.Resources["BigButtonStyle"] 2.从项目中单独分开的资源字典文件( ...
- java.lang.NoClassDefFoundError Adding a jar to an RCP application
给RCP中加入jar包与一般的java工程是有些个区别的,否则会出现"java.lang.NoClassDefFoundError" Open plug-in.xmlGo to R ...
- Discuz 3.X 门户文章插入图片自动添加 alt 标签
最近用 Discuz 搭建了个网站--儿童安全座椅网(www.bbseat.com.cn),用到了门户功能,不得不说Discuz 的功能还是非常强大的,但在使用过程中发现在发表文章时添加了图片却不能像 ...
- jquery文字上下滚动的实现方法
jquery实现文字上下滚动的方法. 代码: //上下滚动var textRoll=function(){$('#notice p:last').css({'height':'0px','opacit ...
- html设置360兼容/极速模式
由于众所周知的情况,国内的主流浏览器都是双核浏览器:基于Webkit内核用于常用网站的高速浏览.基于IE的内核用于兼容网银.旧版网站.以360的几款浏览器为例,我们优先通过Webkit内核渲染主流的网 ...
- (转)MapReduce二次排序
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求 ...
- 为什么C/C++语言使用指针
这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...