天天看點

根據位元組數截取字元串

在網上看到一個考試題,做了試試看的,發現網上給的很多答案并不完全标準,不完全符合題目要求。題目如下:

程式設計:編寫一個截取字元串的函數,輸入為一個字元串和位元組數,輸出為按位元組截取的字元串。 但是要保證漢字不被截半個,如“我ABC4”,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。

package main;
/** 
 * @author H小阿飛
 */
public class SplitChar {
/**
       在UTF-8字元集中一個中文字
      占2個位元組的:0個
      占3個位元組的:基本等同于GBK,含21000多個漢字
      占4個位元組的:中日韓超大字元集裡面的漢字,有5萬多個
 */	
	public void splitIt(String str,int bytes){
		char[] getChar = str.toCharArray();   //字元串以字元數組的形式存儲
		int charLength = getChar.length;
		System.out.println("字元數組的長度:"+charLength);
		int k = 0;
		String reStr = "";
		for(int i=0;i<charLength&&bytes>k;i++){  //bytes>k 用來限制循環的條件。形象點講:bytes相當于一個剪切點,k從字元串數組起點遊動尋找此bytes點。
			String s1 = String.valueOf(getChar[i]);	 //擷取字元串數組中的字元并轉換成String型
			byte[] getBytes = s1.getBytes();     //字元串數組中的字元串以位元組數組的形式存儲	
			if(getBytes.length==3){           //為了應付題目,把一個漢字當做2個位元組
				k += getBytes.length-1;
			}else{
				k += getBytes.length;
			}		
			if(k<=bytes){      //處理如:"a我",2的情況,隻輸出"a",而不是"a我"
				reStr += getChar[i];
			}					
		}	
		System.out.println("截取後所需的字元串:"+reStr);
	}

	public static void main(String[] args){
		String input = " a我b是c一d個e中f國g人";
		String number = "7";
		int num = Integer.valueOf(number);
		SplitChar splitChar = new SplitChar();
		splitChar.splitIt(input,num);
	}
}
           

注:題目本身并不完善,因為它認為一個中文字是兩個位元組的,而且我們平時也都是認為一個中文漢字是兩個位元組,一個英文字母是一個位元組,但在UTF-8字元集下,中文漢字其實是3個位元組,這也是我做了這條題目後才發現的。

對此我有個疑問:那在何種情況下一個中文字是兩個位元組呢?

應題目要求,我對中文位元組數減了1,完全按照題目意思去寫的代碼。

下面的附近是對此進行了擴充,多了一個按字元截取字元串的功能