锁定老帖子 主题:面试题:编写一个截取字符串的函数
精华帖 (0) :: 良好帖 (4) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-09
上周某公司笔试时遇到的题目,题目描述如下: 编程题
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
这道题目的关键点有两个: 1、汉字按照2字节,英文字母按照1字节进行截取(需要找到对应的编码格式) 2、如何判断哪个是汉字,哪个是英文字母(需要找到区分汉字与字母的方法)
关于编码格式(参考文章),哪种编码能符合题目的要求呢,请看下面(参考文章): import java.io.UnsupportedEncodingException; public class EncodeTest { /** * 打印字符串在指定编码下的字节数和编码名称到控制台 * * @param s * 字符串 * @param encodingName * 编码格式 */ public static void printByteLength(String s, String encodingName) { System.out.print("字节数:"); try { System.out.print(s.getBytes(encodingName).length); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(";编码:" + encodingName); } public static void main(String[] args) { String en = "A"; String ch = "人"; // 计算一个英文字母在各种编码下的字节数 System.out.println("英文字母:" + en); EncodeTest.printByteLength(en, "GB2312"); EncodeTest.printByteLength(en, "GBK"); EncodeTest.printByteLength(en, "GB18030"); EncodeTest.printByteLength(en, "ISO-8859-1"); EncodeTest.printByteLength(en, "UTF-8"); EncodeTest.printByteLength(en, "UTF-16"); EncodeTest.printByteLength(en, "UTF-16BE"); EncodeTest.printByteLength(en, "UTF-16LE"); System.out.println(); // 计算一个中文汉字在各种编码下的字节数 System.out.println("中文汉字:" + ch); EncodeTest.printByteLength(ch, "GB2312"); EncodeTest.printByteLength(ch, "GBK"); EncodeTest.printByteLength(ch, "GB18030"); EncodeTest.printByteLength(ch, "ISO-8859-1"); EncodeTest.printByteLength(ch, "UTF-8"); EncodeTest.printByteLength(ch, "UTF-16"); EncodeTest.printByteLength(ch, "UTF-16BE"); EncodeTest.printByteLength(ch, "UTF-16LE"); } }
运行结果如下:
可知,GB2312、GBK、GB18030三种编码格式都符合题目要求
如何判断哪个字符是中文,哪个是字母,可能有很多种方法,仁者见仁吧 一种,可以将字符串转化为字符数组,分别检查字符的GBK形式的字节长度 另一种,可以按照指定的字节数截取对应长度的字符串,然后判断子串的字节长度是否等于指定截取的字节长度,等于的话,说明子串没有中文,不等于的话,说明有中文字符。 请看相关代码: /** * 判断是否是一个中文汉字 * * @param c * 字符 * @return true表示是中文汉字,false表示是英文字母 * @throws UnsupportedEncodingException * 使用了JAVA不支持的编码格式 */ public static boolean isChineseChar(char c) throws UnsupportedEncodingException { // 如果字节数大于1,是汉字 // 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了 return String.valueOf(c).getBytes("GBK").length > 1; }
/** * 将给定的字符串按着给定的截取长度截取 * <br> * 注意一个汉字占2个字节 * @param str * @param subSLength * @return 截取后的字符串 * @throws UnsupportedEncodingException */ public static String subStr(String str, int subSLength) throws UnsupportedEncodingException { if (str == null) return null; else { int tempSubLength = subSLength;//截取字节数 String subStr = str.substring(0, subSLength);//截取的子串 int subStrByetsL = subStr.getBytes("GBK").length;//截取子串的字节长度 // 说明截取的字符串中包含有汉字 while (subStrByetsL > tempSubLength) { subStr = str.substring(0, --subSLength); subStrByetsL = subStr.getBytes("GBK").length; } return subStr; } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-09
文思创新的 ????
|
|
返回顶楼 | |
发表时间:2011-05-10
guo4623009 写道 文思创新的 ???? 不是,你为啥会想到文思创新? |
|
返回顶楼 | |
发表时间:2011-05-10
作为笔试题 意义不大
|
|
返回顶楼 | |
发表时间:2011-05-10
字符串中char是采用utf-16编码的,根本不用其他的编码
|
|
返回顶楼 | |
发表时间:2011-05-10
yangyi 写道 字符串中char是采用utf-16编码的,根本不用其他的编码 char确实是采用utf-16编码,这样的话一个英文字母需要用4个字节,不符合题目要求,题目的意思是英文字母要占用一个字节的编码才行 |
|
返回顶楼 | |
发表时间:2011-05-10
String subByBytesLength(String input, int desiredLength, Charset cs) throws UnsupportedEncodingException { if(input == null || desiredLength < 0 || desiredLength > input.length()) { throw new IllegalArgumentException("Input string in no valid"); } char[] chars = input.toCharArray(); String retval = null; int actualLength = desiredLength; while(retval ==null && actualLength > 0) { char[] subChar = new char[actualLength]; System.arraycopy(chars, 0, subChar, 0, actualLength); String temp = String.valueOf(subChar); if (temp.getBytes(cs).length > desiredLength) { --actualLength; } else { retval = temp; } } return retval; } System.out.println(subByBytesLength("ABCD", 2, Charset.forName("GBK"))); System.out.println(subByBytesLength("我ABC汉DEF",6, Charset.forName("GBK"))); |
|
返回顶楼 | |
发表时间:2011-05-10
分析能力很好,赞一个
|
|
返回顶楼 | |
发表时间:2011-05-10
一道笔试题就要分析这么多,有点难为人了。
|
|
返回顶楼 | |
发表时间:2011-05-10
public static String substr(String text, int maxLen) throws Exception { if (text == null) return null; StringBuilder buf = new StringBuilder(); int i = 0; for (char ch : text.toCharArray()) { i += String.valueOf(ch).getBytes("GBK").length; if (i > maxLen) break; buf.append(ch); } return buf.toString(); } public static void main(String[] args) throws Exception { String text = "我ABC汉DEF"; System.out.println(substr(text, 6)); } |
|
返回顶楼 | |