首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

一路截取字符串的题目

2012-10-21 
一道截取字符串的题目今天在搜索判断字符是否是中文的时候看到一道面试题目:?public static boolean isChi

一道截取字符串的题目

今天在搜索判断字符是否是中文的时候看到一道面试题目:

?

public static boolean isChinseseChar(char ch) {Pattern p = Pattern.compile("[\\u4e00-\\u9fa5]");return p.matcher(ch+"").find();}/** * 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 * 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。 * @param source 源字符串 * @param startPos 开始字节数 * @param endPos 结束字节数 * @param charset 编码类型 * @return 截取的字符串 * @throws UnsupportedEncodingException */public static String cutString(String source,int startPos, int endPos, String charset) throws UnsupportedEncodingException{byte[] bs = source.getBytes(charset);if(startPos > bs.length)throw new RuntimeException("startPos大于字符" + source + "的总共字节数!");if(endPos > bs.length)endPos = bs.length;int offset = 0;int factor = "编".getBytes(charset).length;int start = -1, end = -1;for(int i=0; i<source.length(); i++) {if(offset == startPos)//offset = startPos,其实位置的字节数正好是一个非中文字开头start = i;if(offset > startPos && start == -1)//offset已经大于startPos但是还没找到offset=startPos的位置,说明开始的是一个中文字符start = i;if(isChinseseChar(source.charAt(i)))offset += factor;else offset ++;if(offset == endPos){end = i+1;}if(offset > endPos && end == -1) {end = i;}if(start != -1 && end != -1)break;}if(start >= end)return "";return source.substring(start,end);}public static String cutString(String source,int startPos,int endPos) throws UnsupportedEncodingException{return cutString(source,startPos,endPos,Charset.defaultCharset().toString());}public static String cutString(String source,int endPos) throws UnsupportedEncodingException{return cutString(source,0,endPos,Charset.defaultCharset().toString());}public static String cutString(String source,int endPos, String charset) throws UnsupportedEncodingException{return cutString(source,0,endPos,charset);}/** * @param args * @throws IOException */public static void main(String[] args) throws IOException {String source = "我是abc";System.out.println(source+"[0,4](gbk): "+cutString(source,0,4,"gbk"));System.out.println(source+"[0,4](utf-8): "+cutString(source,0,4,"utf-8"));source = "adf12我是abc";System.out.println(source+"[0,2](gbk): "+cutString(source,0,2,"gbk"));System.out.println(source+"[0,2](utf-8): "+cutString(source,0,2,"utf-8"));source = "add她fdf2我是abc";System.out.println(source+"[0,11](gbk): "+cutString(source,0,11,"gbk"));System.out.println(source+"[0,11](utf-8): "+cutString(source,0,11,"utf-8"));System.out.println(source+"[10,11](gbk): "+cutString(source,10,11,"gbk"));System.out.println(source+"[10,11](utf-8): "+cutString(source,10,11,"utf-8"));System.out.println(source+"[8,12](gbk): "+cutString(source,8,12,"gbk"));System.out.println(source+"[8,12](utf-8): "+cutString(source,8,12,"utf-8"));System.out.println(source+"[9,11](gbk): "+cutString(source,9,11,"gbk"));System.out.println(source+"[9,11](utf-8): "+cutString(source,9,11,"utf-8"));System.out.println(source+"[0,20](gbk): "+cutString(source,0,20,"gbk"));System.out.println(source+"[0,20](utf-8): "+cutString(source,0,20,"utf-8"));}

?打印结果:

?写道我是abc[0,4](gbk): 我是
我是abc[0,4](utf-8): 我
adf12我是abc[0,2](gbk): ad
adf12我是abc[0,2](utf-8): ad
add她fdf2我是abc[0,11](gbk): add她fdf2我
add她fdf2我是abc[0,11](utf-8): add她fdf2
add她fdf2我是abc[10,11](gbk):
add她fdf2我是abc[10,11](utf-8):
add她fdf2我是abc[8,12](gbk): 2我
add她fdf2我是abc[8,12](utf-8): f2
add她fdf2我是abc[9,11](gbk): 我
add她fdf2我是abc[9,11](utf-8): 2
add她fdf2我是abc[0,20](gbk): add她fdf2我是abc
add她fdf2我是abc[0,20](utf-8): add她fdf2我是abc

热点排行