任意の文字列について、文字列の長さをバイト数で切り取ります.


このテーマはjavaプログラマーの面接の宝典から出て、私は半日見てコードが少し小さい問題だと思って、少し修正して、同時にこのテーマがとても面白いと思って、ここで貼ってみんなに討論します:
説明:文字列を切り取る関数を作成し、文字列とバイト数を入力し、バイト単位で切り取る文字列として出力します.しかし、漢字が半分に切り取られないことを保証するには、「私ABC」、4」のように、「私AB」に切り取り、「私ABC漢DEF」、6」と入力し、「私ABC」ではなく「私ABC+漢の半分の漢字」に出力しなければならない.(ある会社の面接問題)
import java.io.IOException;
import java.io.UnsupportedEncodingException;


public class TestString {
	public static void main(String[] args) throws IOException {
		String s1 = "3  ABC   chinese";
		String s2 = "  ";
		int count = 9;
		char c;		
		String original = new String(s1.getBytes("gbk"),"gbk");
		System.out.println(original);
		StringBuffer sb = new StringBuffer("");
		if(s1 != null && !s1.equals("")){
			if(count > 0 && count < original.length()){
				for(int i = 0; i < count ; i++){
					c = original.charAt(i);
//					System.out.println("c:"+c);
					if(String.valueOf(c).getBytes().length > 1){
						--count;
						if(i < count){
						   sb.append(c);
						}
					}
					else{
						sb.append(c);
					}
				}
			}
		}
		System.out.println(sb.toString());
		System.out.println(sb.toString().length());
	}
}

結果:
3  ABC   chinese
3  ABC 
7
ここで重要なのは、文字cが漢字であるか否かを判断することであり、漢字と非漢字文字のバイト数は異なるが、String s 1=「中」である場合である.とString s 2="f";s1.length() = s2.length() = 1;しかしs 1.getBytes().length = 2; s2.getBytes().length = 1;漢字であるかどうかはここで区別しますが、漢字に遭遇した場合はバイト総数を1に減らし、総数countを超えない場合はStringBufferに追加します.