包含中文的字符串中截取前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;
}
}
上一篇:Pycharm最新激活码汇总,pycharm2019激活码


下一篇:2018 pycharm最近激活码