日期:2014-05-20  浏览次数:20859 次

一道面试题,关于英文、汉字字符编码及字节方面的疑问?
Java不是同一用unicode编码吗,字节内存占用不是固定吗?遇到一个Java面试题,有疑问,不是如何。如下:

编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,应该输出为“我ABC”而不是“我ABC+汉的半个”。



------解决方案--------------------
10年前的题?
------解决方案--------------------
比如gbk。
Java code

import java.io.UnsupportedEncodingException;
public class CutString {
    
    public static String substring(String orignal, int count)throws UnsupportedEncodingException {
        //原始字符不为null,也不是空字符串
        if(orignal != null && !"".equals(orignal)) {
            // 将原始字符串转换为GBK编码格式
            orignal = new String(orignal.getBytes(),"GBK");
            // 要截取的字节数大于0,且小于原始字符串的字节数
            if(count>0 && count<orignal.getBytes("GBK").length){
                StringBuffer buff = new StringBuffer();
                char c;
                int i=0;
                while(count > 0){
                    c = orignal.charAt(i);
                    count -= String.valueOf(c).getBytes("GBK").length;
                    if(count >= 0){
                        buff.append(c);
                    }
                    i++;
                }
                return buff.toString();
            }
        }
        return orignal;
    }
    public static void main(String[] args) {
        String s = "我ABC汉DEF";
        try {
            System.out.println(CutString.substring(s,5));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

------解决方案--------------------
这样行吗
Java code

public class Test20 {

    /**
     * @param args
     */
    public String depart(String str,int i){
        String str2="";
        for(int j=0;j<i;j++){
            System.out.println(str.charAt(j));
            str2+=str.charAt(j);    
        }
        return str2;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(new Test20().depart("我是abcdef我", 5));
        
        
    }

}

------解决方案--------------------
这次应该对了
Java code

public class Test20 {

    /**
     * @param args
     */
    public String depart(String str,int i){
        String str2="";
        for(int j=0;j<i;){
            System.out.println(str.charAt(j));
            str2+=str.charAt(j);
            if(str.charAt(j)>=0x4e00&&str.charAt(j)<0x9fa5){
                j++;
                i--;
            }
            else{
                j++;
            }
            if(i<j){
                str2=str2.substring(0, j-1);
            }
        }
        return str2;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(new Test20().depart("我ab是cdef我", 5));
        
        
    }

}

------解决方案--------------------
Java code

    public String cutOutStr(String str,int byteNum){
        if(str==null||str.getBytes().length<=byteNum){
            return str;
        }
        int len = 0;
        StringBuilder sb = new StringBuilder();
        for (Character ch : str.toCharArray()) {            
            len = len + ch.toString().getBytes().length;
            if(len>byteNum){
                break;
            }
            sb.append(ch);        
        }
        return sb.toString();
        
    }