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


今日は外でJavaの面接問題を見ました.文字列の切り取りについて、ここで皆さんと共有します.
タイトルは以下の通りです.
Javaでは、文字列「abcd」は文字列「abこんにちは」と同じ長さで4文字です.しかし、対応するバイト数は異なり、1つの漢字が2バイトを占めている.指定したバイト数でサブストリングを取得する方法を定義します.例えば、「abこんにちは」に対して、3バイト取ると、サブストリングはabと「あなた」の字の半分で、半分は捨てなければなりません.4バイトを取ると「abあなた」、5バイトを取るか「abあなた」を取るか.
1.gbk符号化を考える
方法1:
//      
	private String cutStringByGBK2(String str,int len){// str len    
		//      bug
		//BUG: (bei):GBK  :-84 105
		String resStr="";
		try {
			byte bs[]=str.getBytes("gbk");
			int count=0;	//  
			for(int i=0;i
テスト:
@Test
	public void testCutStringByGBK2() throws IOException{
		String str="ad nan     ";
		byte bs[]=str.getBytes("gbk");
		for(int i=0;i
結果:
0:
1:a
2:ad
3:ad
4:ad 
5:ad n
6:ad na
7:ad nan
8:ad nan
9:ad nan 
10:ad nan 
11:ad nan  
12:ad nan  
13:ad nan   
14:ad nan   
15:ad nan    
16:ad nan    
17:ad nan    i

方法2:
//      
	private String cutStringByGBK1(String str,int len){// str len    
		try {
			byte bs[]=str.getBytes("gbk");
			int count=0;//  
			for(int i=len-1;i>=0;i--){
				if(bs[i]<0){
					count++;
				}else{
					break;
				}
			}
			if(count%2==0){
				return new String(bs,0,len,"gbk");
			}else{
				return new String(bs,0,len-1,"gbk");
			}
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("   gbk  ");
		}
	}
テスト:
@Test
	public void testCutStringByGBK1() throws IOException{
		String str="ad nan     ";
		byte bs[]=str.getBytes("gbk");
		for(int i=0;i
結果:
0:
1:a
2:ad
3:ad
4:ad 
5:ad n
6:ad na
7:ad nan
8:ad nan
9:ad nan 
10:ad nan 
11:ad nan  
12:ad nan  
13:ad nan   
14:ad nan   
15:ad nan    
16:ad nan    
17:ad nan     

2.utf-8符号化を考える
方法1:
//      
	private String cutStringByUTF8(String str,int len){
		//     utf-8    3~4   。         utf-8    4   
		//       3      	//utf-8   : :-25 -112 -78
		String resStr="";
		try {
			byte bs[]=str.getBytes("utf-8");
			int count=0;	//  
			for(int i=0;i
テスト:
@Test
	public void testCutStringByUTF8_1() throws IOException{
		String str="ad nan     ";
		byte bs[]=str.getBytes("utf-8");	
		for(int i=0;i

結果:
0:
1:a
2:ad
3:ad
4:ad
5:ad 
6:ad n
7:ad na
8:ad nan
9:ad nan
10:ad nan
11:ad nan 
12:ad nan 
13:ad nan 
14:ad nan  
15:ad nan  
16:ad nan  
17:ad nan   
18:ad nan   
19:ad nan   
20:ad nan    
21:ad nan    
22:ad nan    
23:ad nan     
メソッド2:
//      
	private String cutStringByUTF8_2(String str,int len){// str len    
		//     utf-8    3~4   。         utf-8    4   
		//       3     
		try {
			byte bs[]=str.getBytes("utf-8");
			int count=0;//  
			for(int i=len-1;i>=0;i--){
				if(bs[i]<0){
					count++;
				}else{
					break;
				}
			}
			return new String(bs,0,len-(count%3),"utf-8");
			
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("   utf-8  ");
		}
	}
テスト:
@Test
	public void testCutStringByUTF8_2() throws IOException{
		String str="ad nan     ";
		byte bs[]=str.getBytes("utf-8");	//    
		for(int i=0;i
結果:
0:
1:a
2:ad
3:ad
4:ad
5:ad 
6:ad n
7:ad na
8:ad nan
9:ad nan
10:ad nan
11:ad nan 
12:ad nan 
13:ad nan 
14:ad nan  
15:ad nan  
16:ad nan  
17:ad nan   
18:ad nan   
19:ad nan   
20:ad nan    
21:ad nan    
22:ad nan    
23:ad nan