1. 程式人生 > >Java---練習(面試題) :字串擷取(2-最終版)

Java---練習(面試題) :字串擷取(2-最終版)

在java中,字串“abcd”與字串“ab你好”的長度是一樣,都是四個字元。
但對應的位元組數不同,一個漢字佔兩個位元組。
定義一個方法,按照指定的位元組數來取子串。
如:對於“ab你好”,如果取三個位元組,那麼子串就是ab與“你”字的半個,那麼半個就要捨棄。如果取四個位元組就是“ab你”,取五個位元組還是“ab你”。

上面給出的是在gbk編碼下的擷取字串。
下面我寫了個程式碼,可以在utf-8和gbk編碼下都能擷取字串。

注意:utf-8下的絕大多數漢字都是3個位元組,所以,為了簡化,全部當成了3個位元組處理。

注意:
在上一個中,我把題意理解錯了,其實題目要求的只是輸出第一個n位元組的字串就可以了。
在上一個中我是把一個字串按照n拆分了。。。。

package io.app;

import java.io.IOException;

import org.junit.Test;

/**
 * 
 * @author 陳浩翔
 *
 * @version 1.0  2016-4-28
 */
public class StringCut {


    public static void main(String[] args) {

        String str = "ab你好a琲琲";
        byte bf[] = str.getBytes();//這裡是採用預設編碼,可能是GBK,也可能是UTF-8
        for
(int i=0;i<=bf.length;i++){ String res; try { res = cutString(str,i); System.out.println(i+" : "+res); } catch (IOException e) { e.printStackTrace(); } } } /** * 根據傳入的字串,來判斷是什麼編碼的,分別導向不同的方法 * @param
str * @param len * @return * @throws IOException */
private static String cutString(String str, int len) throws IOException { //System.getProperty("file.encoding")---獲得系統的編碼 if(System.getProperty("file.encoding").equalsIgnoreCase("gbk")){ return cutStringGbk(str, len); } if(System.getProperty("file.encoding").equalsIgnoreCase("utf-8")){ return cutStringUtf8(str, len); } throw new RuntimeException("不支援當前系統的編碼"); } private static String cutStringUtf8(String str, int len) throws IOException { byte buf[] = str.getBytes("utf-8"); int count=0; for(int i=len-1;i>=0;i--){ if(buf[i]<0){ count++; }else{ break; } } int x = count%3; return new String(buf,0,len-x,"utf-8"); } private static String cutStringGbk(String str, int len) throws IOException { byte buf[] = str.getBytes("gbk"); int count=0; for(int i=len-1;i>=0;i--){ if(buf[i]<0){ count++; }else{ break; } } if(count%2==0){ return new String(buf,0,len,"gbk"); }else{ return new String(buf,0,len-1,"gbk"); } } @Test /** * 可以不需要main方法進行執行單個方法!!!! * @throws IOException */ public void analyze() throws IOException { //String str ="ab你好"; String str ="ab你好a琲琲琲"; //byte buf[] = str.getBytes("gbk"); byte buf[] = str.getBytes("utf-8"); for(byte b:buf){ System.out.print(b+" "); } System.out.println(); } }

GBK下的執行結果:
(漢字為2個位元組)

0 : 
1 : a
2 : ab
3 : ab
4 : ab你
5 : ab你
6 : ab你好
7 : ab你好a
8 : ab你好a
9 : ab你好a10 : ab你好a11 : ab你好a琲琲

UTF-8下的執行結果:
(漢字理解為3個位元組)

0 : 
1 : a
2 : ab
3 : ab
4 : ab
5 : ab你
6 : ab你
7 : ab你
8 : ab你好
9 : ab你好a
10 : ab你好a
11 : ab你好a
12 : ab你好a13 : ab你好a14 : ab你好a15 : ab你好a琲琲