面接問題:文字列切り取り


文字列の切り取り
タイトル:javaでは、文字列「abcd」は文字列「abこんにちは」と同じ長さで、4文字です.しかし、対応するバイト数は異なり、1つの漢字が2バイトを占めている.指定したバイト数でサブストリングを取得する方法を定義します.次のようになります.
「abこんにちは」に対して、3バイト取ると、サブストリングはabと「あなた」の字の半分で、半分は捨てなければなりません.4バイトを取ると「abあなた」、5バイトを取るか「abあなた」を取るか.
どう見ても、漢字バイトの扱いに注意していると思います.実際には、異なる符号化フォーマットでは、gbk符号化フォーマットでは漢字が一般的に2バイトを占め、
いずれも0未満で、utf-8では漢字が2バイトを占めているが、負の正である.システムの現在の符号化フォーマットを考慮します.
コード:


import java.io.UnsupportedEncodingException;

public class StringCutDemo {

	public static void main(String[] args) {
		String str="ab   c       ";//          :2   ,             “ ”      :1 1 (    )
		byte buf[] = null;
//		try {
//			//buf = str.getBytes("gbk");
//			buf = str.getBytes("utf-8");
//			
//		} catch (UnsupportedEncodingException e) {
//			e.printStackTrace();
//		}
		buf = str.getBytes();
		
		//  
		for(byte b:buf){
			System.out.print(b+" ");
		}
		System.out.println();
		
		//  
		System.out.println(str);
		System.out.println("---------------------");
		for(int i=0;i<=buf.length;i++){
			//String s = cutStringByByteGbk(str,i);//  gbk   
			//String s = cutStringByByteUtf8(str,i);//  utf-8 2
//			String s = cutStringByByte(str,i);//        ,          
			String s = cutString(str,i);//      ,        
			System.out.println("  "+i+" ,   :"+s);
		}
		
	}

	private static String cutString(String str, int len) {
		try {
			//      
			String string=System.getProperty("file.encoding");
			int a=0;
			if(string.equalsIgnoreCase("gbk")){
				a=2;
			}
			if(string.equalsIgnoreCase("utf-8")){
				a=3;
			}
			if(a==0){
				return "";
			}
			byte buf[] = str.getBytes(string);
			int count=0;
			//  len      ,    ,         “     ”
			for(int i=len-1; i>=0; i--){
				if(buf[i]<0){
					count++;
				}else{
					break;
				}
			}
			if(count%a==0){//               ,          
				return new String(buf,0,len,string);
			}else{//  ,        
				return new String(buf,0,len-count%a,string);
			}
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("       !");
		}
	}

	private static String cutStringByByteGbk(String str, int len) {
		try {
			//      
			byte buf[] = str.getBytes("GBK");
			int count=0;
			//  len      ,    ,         “     ”
			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");
			}
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("       !");
		}
		
	}
	
	
	private static String cutStringByByteUtf8(String str, int len) {
		try {
			//      
			byte buf[] = str.getBytes("utf-8");
			int count=0;
			//  len      ,    ,         “     ”
			for(int i=len-1; i>=0; i--){
				if(buf[i]<0){
					count++;
				}else{
					break;
				}
			}
			if(count%3==0){//             3   ,          
				return new String(buf,0,len,"utf-8");
			}else{//  ,          
				return new String(buf,0,len-count%3,"utf-8");
			}
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("       !");
		}
	}

	public static String cutStringByByte(String str, int len){
		if(System.getProperty("file.encoding").equalsIgnoreCase("gbk")){
//			System.out.println(System.getProperty("file.encoding"));
			return cutStringByByteGbk(str,len);
		}
		if(System.getProperty("file.encoding").equalsIgnoreCase("utf-8")){
			return cutStringByByteUtf8(str,len);
		}
		return "";
	}
	
}