【總結:】
思路:漢字的unicode編碼都是負數
注意事項:字符串的輸入編碼和輸出編碼、已經eclipse等編譯工具的編碼都會影響結果 所有最好把編碼設置一下或統一;
【自己的代碼】
1 package text; 2 import java.io.IOException; 3 import java.util.Scanner; 4 public class StringTest { 5 /* 6 * 思路:漢子編碼為負數 7 * 注意:不同編碼的字節位數不同,需要區分對待 8 */ 9 public static void main(String[] args) throws IOException { 10 int count=0; 11 //輸入字符串和截取長度 12 Scanner sc=new Scanner(System.in); 13 System.out.println("請輸入字符串:"); 14 String s=sc.nextLine(); 15 byte[] b=s.getBytes("GBK"); 16 System.out.println("請輸入截取長度:"); 17 int num=sc.nextInt(); 18 if(num>b.length||num<0){ 19 System.out.println("輸入數字不正確!"); 20 return ; 21 } 22 //統計截取的字符串包括多少負值,一邊避免半個漢字 23 for(int i=0;i<num;i++){ 24 if(b[i]<0){ 25 count++; 26 } 27 } 28 //因為是GBK,所有模2來判斷 29 if(count%2==0){ 30 System.out.println("截取的字符串為:"+new String(b,0,num,"GBK")); 31 }else{ 32 System.out.println("截取的字符串為:"+new String(b,0,num-1,"GBK")); 33 } 34 } 35 }
【網上參考】
今天去一個公司面試,碰到一個很久前練過的題目,竟然沒答出來,感覺好囧!!回來好好研究一番,貼上代碼:
String類的length()方法是以unicode代碼單元,換言之就是char的個數為來統計的。所以使用subString等截取出來的子串都不會出現半個漢字的情況,因為java一個char類型可以存放一個漢字(2個字節)。而如果以字節byte來截取字符串,就會出現半個漢字的情況。
這道題就是這樣的要求:
編寫一個截取字符串的方法,參數為一個字符串和字節數,返回按字節數截取的子串,保證漢字不被截半個。如:輸入"我abc"、4,應該截為"我ab"。輸入"我abc漢def"、6,應該截為"我abc"
思路:漢字的unicode編碼都是負數,如果這些負數字節在截取的字節數組中成對出現,說明不會截取到半個漢字。如果不是成對出現,則會截取到半個漢字,需要將最后一個字節舍去。
public class StrTest { /*** * 按字節數截取字符串, 不能截出半個漢字, 如果是半個漢字則舍去! * * @param source * @param num * @return */ public static void cutString(String source, int byteCount) { byte[] byteArr = source.getBytes(); int count = 0; // 統計要截取的那部分字節中負數的個數 for (int i = 0; i < byteCount; i++) { if (byteArr[i] < 0) { count++; } } // 負數成對出現 則不會出現半個漢字 if (count % 2 == 0) System.out.println(new String(byteArr, 0, byteCount)); // 負數個數不是偶數,則有半個漢字 else System.out.println(new String(byteArr, 0, byteCount - 1)); } public static void main(String[] args) { cutString("我aabc中國cccr", 6); } }