在網上看到一個考試題,做了試試看的,發現網上給的很多答案并不完全标準,不完全符合題目要求。題目如下:
程式設計:編寫一個截取字元串的函數,輸入為一個字元串和位元組數,輸出為按位元組截取的字元串。 但是要保證漢字不被截半個,如“我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,完全按照題目意思去寫的代碼。
下面的附近是對此進行了擴充,多了一個按字元截取字元串的功能