`
Quenice
  • 浏览: 15600 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

含中文字符的字符串截取(面试题)

    博客分类:
  • java
阅读更多

面试题目编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我ABC4,应该截为“我AB”,输入“我ABCDEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个

 

1、原理

我们知道,根据编码的不同,汉字在字符串中所占字节也不一样,如果是UTF-8编码,汉字占3个字节,如果是GBK编码(本文利用的是GBK编码的实现),汉字占2个字节。但是,英文单词在字符串中,始终占用1个字节。所以,把字符串先转化为字符数组和字节数组,然后同时遍历两个数组,比较在数组同位置的值是否相等,如果相等,那么说明该字符是英文字符,如果不相同则说明该字符是中文字符,同时记录下来。大致原理就是这样的,大家看代码实现

 

2、代码实现

 

/**
 * @author Quenice
 */
public class StringSplit {
	public static void main(String[] args) throws Exception {
		System.out.println(split("a好a嗯哦",3));
	}
	
	public static String split(String str, int byteNum) throws Exception {
		String ret = null;
		/*
		 * 转换为字符数组,数组中的元素可能是英文字符,也可能是中文字符
		 */
		char[] charArr = str.toCharArray();
		/*
		 * 以GBK编码转换为字节数组,数组元素可能是英文也可能是半个中文,
		 * 如果字符串全部是英文字符的话,那么转换之后的效果其实和转换为字符数组是一个意思
		 */
		byte[] byteArr = str.getBytes("GBK");
		//在拆分个数范围(即byteNum)内,计算字节数组中有多少半个汉字
		int notCharLen = 0;
		for(int i = 0;i < byteNum;i ++) {
			if(i > charArr.length - 1) {
				notCharLen ++;
			} else {
				/*
				 * 比较字符数组和字节数组对应的元素是否相等,不等说明是半个汉字,notCharLen++,相当说明是英文字符,不操作
				 * charArr[i - notCharLen/2]就是对应于第i个字节
				 */
				if(charArr[i - notCharLen/2] != byteArr[i]) {
					notCharLen ++;
				}
			}
		}
		
		if(notCharLen%2 == 0) {//如果是2的膜,说明正好不用拆封汉字
			ret = str.substring(0,byteNum - notCharLen/2);
		} else {//需要拆封汉字
			ret = str.substring(0,byteNum - notCharLen/2 - 1);
		}
		return ret;
	}
}

  

2
2
分享到:
评论
7 楼 lsfws 2013-07-04  
牛B。。。。
6 楼 Quenice 2013-07-02  
OK,谢谢提醒,注释已加上
thihy 写道
CodePoint!!!

5 楼 Quenice 2013-07-02  
hailongshih 写道
lz能否把注释写清楚,有些看不懂

不好意思啊,这几天比较忙,没时间搞这个~
4 楼 hailongshih 2013-07-02  
不错,谢谢lz,我看懂了
mrzhanghao 写道
通过toCharArray获取到字符数组,通过getBytes获得字节数组.
开始循环,如果两个数组的下标charArr[i - notCharLen/2]=i(这时notCharLen=0)相同的元素值相等,说明是英文字母,略过.
如果不同,说明在字节数组中这是汉字的前面半个.使得notCharLen++.
下次判断charArr[i - notCharLen/2]就将字节数组中的汉字计算在内了,两个数组的下标比较又在同一起跑线上了.

3 楼 mrzhanghao 2013-07-02  
通过toCharArray获取到字符数组,通过getBytes获得字节数组.
开始循环,如果两个数组的下标charArr[i - notCharLen/2]=i(这时notCharLen=0)相同的元素值相等,说明是英文字母,略过.
如果不同,说明在字节数组中这是汉字的前面半个.使得notCharLen++.
下次判断charArr[i - notCharLen/2]就将字节数组中的汉字计算在内了,两个数组的下标比较又在同一起跑线上了.
2 楼 hailongshih 2013-07-01  
lz能否把注释写清楚,有些看不懂
1 楼 thihy 2013-06-30  
CodePoint!!!

相关推荐

    java截取字符串程序,一道面试题。答案

    java截取字符串,一道面试题。好像没有找到正确答案,今天找时间做了一个,仅供参考。本人运行过了。

    华为-华为od题库练习题之截取字符串.zip

    在IT领域,特别是软件开发和面试准备中,掌握特定公司的技术要求是非常...这个压缩包“华为_华为od题库练习题之截取字符串”就是一个很好的实践资源,通过解题,你可以更好地掌握字符串截取的技巧,并提升编程能力。

    java按字节截取带有汉字的字符串的解法(推荐)

    Java面试题中提到的问题是,当截取字符串时,要保证汉字不被分割。这是因为substring方法在处理多字节字符(如汉字)时,可能会在字符中间截断,导致乱码。为了解决这个问题,我们需要编写一个定制的截取函数,这个...

    常见的Java上机面试题.pdf

    2. 字符串截取算法 在截取字符串函数中,需要使用一个循环来遍历输入字符串,并根据字节数来截取字符串。在这个过程中,需要考虑中文字符和英文字符的占用字节数问题,可以使用正则表达式来匹配中文字符。 3. Java...

    经典php冒泡排序面试题

    标题与描述中的知识点主要聚焦在两个方面:一是PHP中的冒泡排序算法,二是字符串处理,具体涉及了在GBK编码下的字符串截取方法。下面将详细展开这两个知识点。 ### 冒泡排序算法 冒泡排序是一种简单的排序算法。它...

    Java面试题以及答案整理.pdf

    为了在Java面试中脱颖而出,了解和掌握常见的面试题及答案至关重要。以下是一些关键知识点的详细解析: 1. **super()与 this()的区别** `super()`用于调用父类的构造器,确保子类实例化时父类的初始化;`this()`则...

    Java后端面试题

    16. **字符串截取**:需要注意对中文字符的处理,避免截断。 17. **打印昨天的当前时刻**:使用`Calendar`或`LocalDateTime`类。 18. **文件读写和计数器实现**:使用`FileReader`、`FileWriter`等类。 19. **...

    php面试题php面试题php面试题php面试题

    如果变量不存在、为null、为0、为''(空字符串)、为"0"(数字字符串零)或者为`array()`(空数组),则`empty()`返回true,否则返回false。 - `$a1`、`$a2`、`$a3`、`$a4`、`$a5`、`$a6`、`$a7`均为空或假值,因此...

    PHP面试题及答案 ,关于PHP最新面试题 ,绝对经典!最近一段时间的面试题

    多字节字符串截取 **题目**: 如何处理多字节字符串的截取? **解析**: - 使用`mb_substr()`函数可以正确处理多字节字符集,如UTF-8。 ```php $str = "你好,世界!"; echo mb_substr($str, 0, 2, 'utf-8'); // ...

    讲座资料(2021年-2022年收藏的常见的Java上机面试题.doc

    以下是一道典型的字符串截取面试题: **面试题1:怎样截取字符串** 该题要求编写一个函数,根据输入的字节数截取字符串,同时保证汉字不被分割。这个问题的关键在于理解Java中字符编码,尤其是中文字符占两个字节...

    oracle数据工程师面试题.pdf

    "oracle数据工程师面试题.pdf" 本资源是一个Oracle数据工程师面试题库,涵盖了多个关于Oracle数据库管理和开发的问题。下面是从文件中提取的知识点: 1. 数据类型和操作 * varchar2数据类型:varchar2是Oracle中...

    Java经典面试题(带答案)

    Java经典面试题 知识点1: 数据统计 在给定的文本文件中,统计出总行数,并找出出现次数最多的那个整数。这个问题考察了数据统计和分析的能力。在解决这个问题时,需要使用Java中的文件输入/输出流、字符串处理和数...

    java面试题-50道最容易考的java题

    **String 类常用方法**:String 类提供了丰富的操作字符串的方法,包括获取长度(`length()`)、获取特定位置的字符(`charAt(int index)`)、查找子串(`indexOf()`)、截取子串(`substring()`)、比较字符串内容...

    java 面试题 经典收藏

    在处理包含中文等多字节字符的字符串时,需要确保截取操作不会导致半个汉字被截取,这可能会影响显示效果。 #### 代码解析: 1. **逐字节截取**:使用`substring`函数实现,它接受一个字符串和截取的字节数作为参数...

    面试UC浏览器的一道处理字符串的题目(已提供答案)

    通常,这样的面试题可能会包含字符串的查找、替换、分割、拼接等操作,或者是对字符串进行特定的算法处理,如正则表达式匹配、字符串排序等。 标签进一步明确了几个关键信息点:“面试”意味着这是一个考核性质的...

    面试问题整合_面试题.doc

    - `substring()`:截取字符串的一部分。 - `replace()`:替换字符串中所有指定内容。 - `indexOf()`和`lastIndexOf()`:查找指定内容第一次出现和最后一次出现的索引。 - `concat()`:连接两个字符串。 - `...

    中科软面试题集合(精品)

    * 使用substring()方法截取字符串。 2. 面向对象编程 * 对象:运行期的基本实体,封装了数据和操作这些数据的代码的逻辑实体。 * 类:具有相同类型的对象的抽象。 * 封装:将数据和代码捆绑到一起,避免了外界的...

Global site tag (gtag.js) - Google Analytics